POJ1396 ZOJ2017 Simple Arithmetics

//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

请按任意键继续. . .
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值