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;
}
最后,要注意,只有两个输出之间有空行,最后一个输出之后是没有空行的!