模拟题,非大数乘法运算;
解析:细节比较多,我是用int型数组进行存储,如果用字符型存储,则需要考虑前缀0的情况;
一、当计算过程中出现运算结果为0时,此时0的位数为1,如果按照常规处理,长度(即位数)就为0;
二、当n和m中任意一个数为0,或者当m为个位数时,直接输出结果,不需要输出中间过程;
三、当n和m中出现负数时或者在运算过程中出现负数情况时,注意减去负数的长度;
#include<iostream> #include<cstdio> #include<cmath> using namespace std; const int maxn = 10005; int num1[ maxn ], num2[ maxn ]; int main(){ int Case, n, m, len, sum, ans, len1, len2, len3, temp, tempn, tempm; cin >> Case; while( Case-- ){ cin >> n >> m; sum = n * m; //cout << sum << endl; tempn = n, tempm = m; len = 0; /*1*/ int k = 0, k1 = 0, k2 = 0; if( n <= 0 ) k1 = 1; while( n ){ num1[ k1++ ] = n % 10; n /= 10; } k2 = 0; if( m <= 0 ) k2 = 1; while( m ){ num2[ k2++ ] = m % 10; m /= 10; } /*1*/ /*2*/ len = 8; if( tempn < 0 ) k1 + 1; len1 = len - k1; while( len1-- ){ cout << " "; } cout << tempn << endl; len1 = len - k2 - 1; cout << "x"; while( len1-- ){ cout << " "; } cout << tempm << endl; /*2*/ /*3*/ if( k2 > 1 ){ cout << "--------" << endl; k = max( k1, k2 ); ans = 0; for( int i = 0; i < k2; ++i ){ temp = num2[ i ] * tempn; int t = temp; //cout << temp << endl; if( t <= 0 ) len3 = 1; else len3 = 0; while( t ){ len3++; t /= 10; } //cout << len3 << "aaaaaaaaaaaaaaaaa" << endl; /*空格*/ len2 = len - ans - len3; /*单行输出*/ while( len2-- ) cout << " "; cout << temp << endl; /*某位空格数 */ ans++; //cout << ans << "aaaaaaaaaaaaaaaa" << endl; } } /*3*/ /*4*/ cout << "--------" << endl; len = 0; if( sum <= 0 ) len = 1; while( sum ){ len++; sum /= 10; } len = 8 - len; while( len-- ) cout << " "; cout << tempn * tempm << endl; cout << "********************" << endl; /*4*/ } return 0; }
原文:http://blog.csdn.net/bo_jwolf/article/details/20004505