HDU Problem1002 A+BⅡ的C解决方法

HDU Problem1002 A+BⅡ的C解决方法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002

题目:在这里插入图片描述

乍看之下,以为这是一个输出格式稍微有些复杂的A+B problem;但题目细心的指出A和B可能长度不超过1000(意思就是测试数据会很大,接近101000);所以这题用long long int (263-1)也是远远不够的,那就只能用字符串来代替数字进行运算。
第一个问题就是字符串的输入,因为输入字符不会跳过空格和换行符(这些我们都看不到,但它们确确实实存在),我们要注意不要错误的运算这些特殊符号,好消息是我们可以利用这个判断数字的长度和终止位置。
部分代码如下:

for(int i=i; ;i++){
    scanf("%c",&a[i]);
    if(a[i]==' ') break;
  }  
  lenth_a=i-1; //减去多输入的空格 

for中间不需要判断语句,让条件去终止循环。
输入b时只需要判断是否为 ‘\n’ 就好了;
接着是运算,要考虑进位,说以要引入一个用来进位的变量 v;也是用char来定义,因为加法进位只可能进1,所以v只有两种情况:0和1,当进位时是 ‘1’,不进位时是 ‘0’,加法代码实现如下:

c[i]=a[i]+b[i]+v-'0'-'0'; //数组c[]用来存结果

减’0’是为了减去ACII码,如 ‘3’-‘0’=3,其余的读者自行体会。
从后往前加,但这时又遇到了问题,示例给的两个数字长度都相同,但实际上测试数据不会那么规整,所以还需要判断哪个先加完,把剩下的存进c[];还有一点需要注意,如果剩下的是×××9但之前有进位怎么办?
整个代码实现如下:

#include<stdio.h>
#define maxn 1010
char a[maxn],b[maxn],sum[maxn];
int main(){
	int t,i,j,Case=1,Max;
	scanf("%d",&t);
	getchar();
	while(t--){
	   int lenth_a,lenth_b,Max=0;
	   char v='0';
	   sum[0]='0';
	   for(i=1;;i++){
   		scanf("%c",&a[i]);
  		if(a[i]==' ') break;
   	  }	
   	  lenth_a=--i;
   	   for(j=1;;j++){
   		scanf("%c",&b[j]);
   		if(b[j]=='\n') break;
   	  }	
   	  lenth_b=--j;    
   	  Max=lenth_a>lenth_b ? lenth_a : lenth_b;
      for(Max;i!=0 && j!=0;i--,j--,Max--){
      	sum[Max]=a[i]+b[j]+v-'0'-'0';
      	if(sum[Max]>'9') { v='1';sum[Max]=sum[Max]-10;}
      	else v='0';
      }
      while(i)
      {
	   sum[i]=a[i]+v-'0';
	   if(sum[i]>'9') { v='1';sum[i]=sum[i]-10;}
	    else v='0';
	   i--;
      }
      while(j)
      {
	   sum[j]=b[j]+v-'0';
	   if(sum[j]>'9') { v='1';sum[j]=sum[j]-'10'+'0';}
	    else v='0';
	   j--;
      }
      Max=lenth_a>lenth_b ? lenth_a : lenth_b;
   	  printf("Case %d:\n",Case++);
   	  for(i=1;i<=lenth_a;i++)
       printf("%c",a[i]);
	  printf(" + ");
      for(i=1;i<=lenth_b;i++)
	     printf("%c",b[i]);
      printf(" = ");
      if(v=='1') printf("1");
      for(i=1;i<=Max;i++)
       printf("%c",sum[i]);
      printf("\n");
      if(t) printf("\n");
    }
	return 0;
}

最后,要注意,只有两个输出之间有空行,最后一个输出之后是没有空行的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值