模拟题,非大数乘法运算;
解析:细节比较多,我是用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;
}