//4_7_28: Simple Arithmetics 打印加减乘计算过程 POJ1396 ZOJ2017
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const short maxc = 1000 + 10;
const short maxn = 500 + 10;
short max(short a,short b,short c)
{
short temp = a > b ? a : b;
return temp > c ? temp : c;
}
int main()
{
char sign,str[maxc],mul[maxn][maxn];
short i,j,T,max_line,max_num,num1_cnt,num2_cnt,num1[maxn],num2[maxn];
short temp,temp_mul,carry,carry_mul,ans_cnt,temp_cnt,len[maxn],ans[maxc];
cin >> T;
while(T--)
{
scanf("%s",str);
i = ans_cnt = num2_cnt = num1_cnt = 0;
while(str[i] >= '0' && str[i] <= '9') num1[num1_cnt++] = (short)(str[i++] - '0');
if(str[i] == '+') sign = '+';
else if(str[i] == '-') sign = '-';
else if(str[i] == '*') sign = '*';
i++;
while(str[i]) num2[num2_cnt++] = (short)(str[i++] - '0');
for(i = 0,j = num1_cnt - 1;i < j;i ++,j --)
{
temp = num1[i];
num1[i] = num1[j];
num1[j] = temp;
}
for(i = 0,j = num2_cnt - 1;i < j;i ++,j --)
{
temp = num2[i];
num2[i] = num2[j];
num2[j] = temp;
}
if(sign == '+' || sign == '-' || (sign == '*' && num2_cnt == 1))
{
if(sign == '+')
{
carry = 0;
if(num1_cnt > num2_cnt) for(i = num2_cnt;i < num1_cnt;i ++) num2[i] = 0;
else if(num2_cnt > num1_cnt) for(i = num1_cnt;i < num2_cnt;i ++) num1[i] = 0;
max_num = num1_cnt > num2_cnt ? num1_cnt : num2_cnt;
for(i = 0;i < max_num;i ++)
{
temp = carry;
carry = (num1[i] + num2[i] + temp) / 10;
ans[ans_cnt++] = (num1[i] + num2[i] + temp) % 10;
}
if(carry) ans[ans_cnt++] = 1;
max_line = max(num1_cnt,num2_cnt + 1,ans_cnt);
}
else if(sign == '-')
{
carry = 0;
for(i = 0;i < num1_cnt;i ++) ans[i] = num1[i];
for(i = 0;i < num2_cnt;i ++)
{
ans[i] = ans[i] - num2[i] - carry;
if(ans[i] < 0)
{
ans[i] += 10;
carry = 1;
}
else carry = 0;
}
while(carry == 1)
{
ans[i] -= carry;
if(ans[i] < 0)
{
ans[i] += 10;
carry = 1;
}
else carry = 0;
i++;
}
ans_cnt = num1_cnt;
while(ans_cnt >= 1 && ans[ans_cnt - 1] == 0) ans_cnt --;
if(ans_cnt == 0)
{
ans[0] = 0;
ans_cnt = 1;
}
max_line = max(num1_cnt,num2_cnt + 1,ans_cnt);
}
else if(sign == '*')
{
carry = 0;
for(i = 0;i < num1_cnt;i ++)
{
temp = carry;
carry = (num1[i] * num2[0] + temp) / 10;
ans[ans_cnt++] = (num1[i] * num2[0] + temp) % 10;
}
if(carry) ans[ans_cnt++] = carry;
max_line = max(num1_cnt,num2_cnt + 1,ans_cnt);
}
for(i = 0;i < max_line - num1_cnt;i ++) putchar(' ');
for(i = num1_cnt - 1;i >= 0;i --) printf("%d",num1[i]);
putchar('\n');
for(i = 0;i < max_line - num2_cnt - 1;i ++) putchar(' ');
putchar(sign);
for(i = num2_cnt - 1;i >= 0;i --) printf("%d",num2[i]);
putchar('\n');
temp = ans_cnt > num2_cnt + 1 ? ans_cnt : num2_cnt + 1;
for(i = 0;i < max_line - temp;i ++) putchar(' ');
for(i = 0;i < temp;i ++) putchar('-');
putchar('\n');
for(i = 0;i < max_line - ans_cnt;i ++) putchar(' ');
for(i = ans_cnt - 1;i >= 0;i --) printf("%d",ans[i]);
printf("\n\n");
}
else
{
for(i = 0;i < maxc;i ++) ans[i] = 0;
for(i = 0;i < num2_cnt;i ++)
{
carry = 0;
carry_mul = 0;
temp_cnt = 0;
for(j = 0;j < num1_cnt;j ++)
{
temp = carry;
temp_mul = carry_mul;
carry = (ans[i + j] + num1[j] * num2[i] + temp) / 10;
ans[i + j] = (ans[i + j] + num1[j] * num2[i] + temp) % 10;
carry_mul = (num1[j] * num2[i] + temp_mul) / 10;
mul[i][temp_cnt++] = (char)((num1[j] * num2[i] + temp_mul) % 10 + '0');
}
if(carry)
{
ans[i + j] = carry;
ans_cnt = i + j + 1;
}
else ans_cnt = i + j;
if(carry_mul) mul[i][temp_cnt++] = (char)(carry_mul + '0');
while(temp_cnt >= 1 && mul[i][temp_cnt - 1] == '0') temp_cnt --;
if(temp_cnt == 0)
{
mul[i][0] = '0';
temp_cnt = 1;
}
len[i] = temp_cnt;
}
max_line = max(num1_cnt,num2_cnt + 1,ans_cnt);
for(i = 0;i < max_line - num1_cnt;i ++) putchar(' ');
for(i = num1_cnt - 1;i >= 0;i --) printf("%d",num1[i]);
putchar('\n');
for(i = 0;i < max_line - num2_cnt - 1;i ++) putchar(' ');
putchar(sign);
for(i = num2_cnt - 1;i >= 0;i --) printf("%d",num2[i]);
putchar('\n');
temp = len[0] > num2_cnt + 1 ? len[0] : num2_cnt + 1;
for(i = 0;i < max_line - temp;i ++) putchar(' ');
for(i = 0;i < temp;i ++) putchar('-');
putchar('\n');
for(i = 0;i < num2_cnt;i ++)
{
for(j = 0;j < max_line - len[i] - i;j ++) putchar(' ');
for(j = len[i] - 1;j >= 0;j --) printf("%c",mul[i][j]);
putchar('\n');
}
for(i = 0;i < max_line - ans_cnt;i ++) putchar(' ');
for(i = 0;i < ans_cnt;i ++) putchar('-');
putchar('\n');
for(i = 0;i < max_line - ans_cnt;i ++) putchar(' ');
for(i = ans_cnt - 1;i >= 0;i --) printf("%d",ans[i]);
printf("\n\n");
}
}
return 0;
}
/*测试结果:通过POJ1396 ZOJ2017检测
4
100001-9
100001
-9
-----
99992
1*1234
1
*1234
-----
4
3
2
1
----
1234
1234*1
1234
*1
----
1234
999999999*999999999999
999999999
*999999999999
-------------
8999999991
8999999991
8999999991
8999999991
8999999991
8999999991
8999999991
8999999991
8999999991
8999999991
8999999991
8999999991
---------------------
999999998999000000001
请按任意键继续. . .
*/
POJ1396 ZOJ2017 Simple Arithmetics
最新推荐文章于 2018-08-15 20:19:00 发布