杭电ACM 1002

#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剩下没有对应上的元素。就看牺牲空间还是牺牲时间了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值