#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
scanf("%d",&n);// can not continue to next sentence when scanf("%d\n",&n);
int i,j,k;
char t1[1000];
char t2[1000];
int t;
for(k=1;k<=n;k++)
{
scanf("%s %s",t1,t2);// can not contain "\n"
printf("Case %d:\n",k);
printf("%s + %s = ",t1,t2);
char * a=t1;
char * b=t2;
int lenA=strlen(a);
int lenB=strlen(b);
char *c;
if(lenA<lenB)
{
c=a;
a=b;
b=c;
lenA=strlen(a);
lenB=strlen(b);
}
t=lenA;
int sum[1001]={0};
//int i,j;
for(i=lenA-1,j=lenB-1;i>0;i--,j--)
{
if(j>=0)
sum[i]+=a[i]-'0'+b[j]-'0';
else
sum[i]+=a[i]-'0';
if(sum[i]>=10)
{
sum[i-1]++;
sum[i]=sum[i]%10;
}
}
if(j==0)
sum[0]+=a[0]-'0'+b[0]-'0';
else
sum[0]+=a[0]-'0';
if(sum[0]>=10)
{
sum[0]=sum[i]%10;
for(i=lenA-1;i>=0;i--)
{
sum[i+1]=sum[i];
}
sum[0]=1;
t++;
}
for(i=0;i<t;i++)
printf("%d",sum[i]);
printf("\n");
//马蛋!! 就是你才令我一直不过!最后一个test case,不输出“\n”!!
if(k!=n)
printf("\n");
}
return 0;
}
在编程过程中,发现几个有趣的地方:
1. 关于“++”和“+1”
int u=5,v=5;
t1[u--]='0';
t1[v-1]='0';
printf("u is %d;",u);
printf("v is %d",v);
//Output:u is 4;v is 5
//“++”“--”都会使得原值改变,而v-1,v+1不会
2. char * 和char [] 的scanf
char * a;
char * b;
scanf("%s %s",a,b);//发生中断
char t_1[1000];
char t_2[1000];
scanf("%s %s",t_1,t_2);//printf("%s",a);a如果是char*,而不是char[],会出现中断
我个人觉得,是因为scanf本来的第二个参数就是要写入输入的值的地址。而char *a只是声明了一个空闲的可以放指针(也就是char地址)的地方(四个字节大小)。这四个字节里面本来有地址,因为声明char*a时,未初始化,而旧地址指向了其他地方,所以发生访问冲突,才会中断。而char t_1[1000]不一样,因为是char数组,所以声明的时候就开辟出一段空间给t_1,t_1是分配的空间的首地址,所以肯定不会发生访问冲突。
下面程序测试了一下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char * a;
char * b;
//scanf("%s %s",a,b);
printf("%d\n",sizeof(a));
printf("a :%d\n",a);
printf("&a :%d\n",&a);
printf("*a :%c\n",*a);
}
从上面结果看到,未初始化时,a指针指向的地方放着0。
把上面最后一句改成
printf("*a :%c\n",*a);
3. sizeof
sizeof返回对象所占的字节数。
4. 发现多次用char t_1[] 声明char数组时,得到的地址貌似是一样的,原因如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
scanf("%d",&n);
//printf("%d",n);
int i,j,k;
char * t1[n];
char * t2[n];
for(k=0;k<n;k++)
{
char t_1[1000];
char t_2[1000];
scanf("%s %s",t_1,t_2);
t1[k]=t_1;
t2[k]=t_2;
}
for(k=0;k<n;k++)
{
printf("%s %s \n",t1[k],t2[k]);
}
}
5. char类型和int类型混合运算怎么都问题 = =
一开始我是想让sum数组也为char类型的,但是我用以下代码,怎么改都算不出对的结果,所以最后还是把sum数组改成int类型了。
char sum[1001]={'0'};
int i,j;
for(i=lenA-1,j=lenB-1;i>0;i--,j--)
{
if(j>=0)
sum[i]+=a[i]-'0'+b[j]-'0';
else
sum[i]+=a[i]-'0';
if(sum[i]>=char('10'))//sum[i]>='10' 不成功。。一直都跳不进if里面;sum[i]>=char('10')才可以
{
sum[i-1]++;
sum[i]=(int(sum[i]-'10'))%10;//int(10)和char做运算 有问题
}
}
另外,也发现我的解答的改进点:
1. 把sum数组里的数字反方向放,这样就不用因为进位,而使得所有数字都往后退一格了。
2. 我这里是多弄了个char *c,非要把大的数组放在a,小数组放在b。可以用多两个循环来分别遍历a和b剩下没有对应上的元素。就看牺牲空间还是牺牲时间了。