⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p2017_模拟计算.cpp

📁 高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程
💻 CPP
字号:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define  MAXN      400
#define  max(a,b) (a>b?a:b)

struct   HP {
         int len , s [MAXN];
}        A , B;

char     Str [MAXN * 2 + 1] , Oper;

void     back ( HP & A )
{
         for ( int j = 0; j < A.len / 2; j ++ )
             A.s [j] ^= A.s [A.len - j - 1] ^= A.s [j] ^= A.s [A.len - j - 1];
}

void     print ( const HP &A )
{
         for ( int i = A.len - 1; i >= 0; i -- ) printf ( "%d" , A.s [i] );
         printf ( "\n" );
}

void     part ()
{
         int  len = strlen ( Str ) , i;
         for ( i = 0; isdigit ( Str [i] ); i ++ )
             A.s [i] = Str [i] - '0';
         A.len = i; Oper = Str [i];
         for ( int j = ++i; j < len; j ++ )
             B.s [j - i] = Str [j] - '0';
         B.len = len - i;
         back ( A ) , back ( B );
//         print ( A ) , print ( B );
}

void     print_ ( int many , int wide = 0 )
{
         for ( int i = 0; i < wide - many; i ++ ) printf ( " " );
         for ( int i = 0; i < many; i ++ ) printf ( "-" );
}

void     Addition ()
{
         int      Max = max ( A.len , B.len + 1 );
         HP       C;
         int      i , j;
         for ( i = 0 , j = 0; i < A.len || i < B.len; i ++ , j /= 10 ) {
             if ( i < A.len ) j += A.s [i];
             if ( i < B.len ) j += B.s [i];
             C.s [i] = j % 10;
         }
         while ( j ) C.s [i++] = j % 10 , j /= 10; C.len = i;
         Max = max ( Max , C.len );
         
         print_ ( 0 , Max - A.len ) , print ( A );
         print_ ( 0 , Max - B.len - 1 ) , printf ( "+" ) , print ( B );
         print_ ( max ( B.len + 1 , C.len ), Max ); printf ( "\n" );
         print_ ( 0 , Max - C.len ); print ( C );
}

void     Subtration ()
{
         int      Max = max ( A.len , B.len + 1 );
         HP       C;
         int      i , j;
         for ( i = 0 , j = 0; i < A.len; i ++ ) {
             C.s [i] = A.s [i] - j;
             if ( i < B.len ) C.s [i] -= B.s [i];
             if ( C.s [i] < 0 ) C.s [i] += 10 , j = 1;
             else j = 0;
         }
         for ( C.len = A.len; C.len > 1 && C.s [C.len - 1] == 0; C.len -- );
         Max = max ( Max , C.len );
         
         print_ ( 0 , Max - A.len ) , print ( A );
         print_ ( 0 , Max - B.len - 1 ) , printf ( "-" ) , print ( B );
         print_ ( max ( B.len + 1 , C.len ) , Max ) , printf ( "\n" );
         print_ ( 0 , Max - C.len ) , print ( C );
}

void     Multiply ()
{
         int      Max = max ( A.len , B.len + 1 );
         HP       Sub [MAXN] , Ans;
         int      i , j , k;
         for ( k = 0; k < B.len; k ++ ) {
             for ( i = j = 0; i < A.len; i ++ , j /= 10 ) {
                 j += A.s [i] * B.s [k];
                 Sub [k].s [i] = j % 10;
             }
             while ( j ) Sub [k].s [i ++] = j % 10 , j /= 10;
             Sub [k].len = i;
             while ( Sub [k].len > 1 && Sub [k].s [Sub [k].len - 1] == 0 ) Sub [k].len --;
             Max = max ( Max , Sub [k].len + k );
         }
         
         memset ( Ans.s , 0 , sizeof ( Ans.s ));
         for ( i = 0; i < A.len; i ++ )
             for ( j = 0; j < B.len; j ++ ) Ans.s [i + j] += A.s [i] * B.s [j];
         Ans.len = A.len + B.len - 1;
         for ( i = j = 0; i < Ans.len; i ++ , j /= 10 )
             j += Ans.s [i] , Ans.s [i] = j % 10;
         while ( j ) Ans.s [Ans.len ++] = j % 10 , j /= 10;
         while ( Ans.len > 1 && Ans.s [Ans.len - 1] == 0 ) Ans.len --;
         Max = max ( Max , Ans.len );
         
         print_ ( 0 , Max - A.len ) , print ( A );
         print_ ( 0 , Max - B.len - 1 ) , printf ( "*" ) , print ( B );
         print_ ( max ( B.len + 1 , Sub [0].len ) , Max ) , printf ( "\n" );
         for ( k = 0; k < B.len; k ++ )
             print_ ( 0 , Max - k - Sub [k].len ) , print ( Sub [k] );
         if ( B.len <= 1 ) return;
         print_ ( Ans.len , Max ) , printf ( "\n" );
         print_ ( 0 , Max - Ans.len ) , print ( Ans );
         
}

main ()
{
     int total;
     for ( scanf ( "%d\n" , &total ); total; total -- ) {
         gets ( Str );
         part ();
         switch ( Oper ) {
                case   '+'  : Addition (); break;
                case   '-'  : Subtration (); break;
                case   '*'  : Multiply (); break;
         }
         printf ( "\n" );
     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -