LevOJ P1120

题目描述
给出两个 200 位以内的正整数,求其和。

输入描述
多组测试数据。每组测试数据包括两行,每行一个数。

输出描述
每组测试输出一行,为所求两个整数之和。

样例输入
123

456

样例输出
579

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	char b1[210]={'\0'},b2[210]={'\0'};
	//printf("shu ru :\n");
	while(~scanf("%s %s",b1,b2))
	{
		int a1[210]={0},a2[210]={0},a3[210]={0},i,j,x,y;
		x=strlen(b1)-1;
		y=strlen(b2)-1;
		for(i=0,j=x;j>=0;i++,j--)//放进数组
		{
			a1[i]=b1[j]-'0';
		} 
		for(i=0,j=y;j>=0;i++,j--)//放进数组
		{
			a2[i]=b2[j]-'0';
		} 
		for(i=0;i<210;i++)//加法
		{
			a3[i]+=a1[i]+a2[i];
			//printf("**%d**\n",a3[i]);
			if(a3[i]>=10)
			{
				a3[i]=a3[i]-10;
				a3[i+1]=a3[i+1]+1;
			}
		}
		int mark;
		for(i=209;i>=0;i--)
		{
			if(a3[i]!=0)
			{
			mark=i;
			break;
		    }
			
		}
		for(i=mark;i>=0;i--)//输出
		{
			printf("%d",a3[i]);
		}
		printf("\n");
	}
	return 0;
}

流程:
一、接收字符串
注意点:
1、题目要求是两百位以内的正整数,说明最大是两百位,不能用int、long来做,因为超出了int和long所能表示的范围。
2、接收数字时只能用字符串接收,无法用长数组来接收,因为数组会把一长串数字全放在一个位置,不能一个数字一个数字拆开存放,一个位置又放不下两百位的数。
3、字符串的长度应为数字最大长度+1,即200+1,因为字符串的存放会在末尾自动加上\0,表示字符串的结束,这个\0会占用一个位置。正因此,sizeof(“hello”)的值会是6。but区分strlen(),它是不计入\0的,strlen(”hello“)=5。
4、此外,还get到为啥vs里面用是scanf接收字符串时一直失败呢?因为……忘了,解决的方法是在#include前面加上一样什么东西的来着(一查便知)。

二、将字符串存进数组里
注意点:
1、经验证,第一个输入的数字会放在字符串中下标为0的地方,而数字的输入顺序是先输入最高位,最后输入个位,所以按照数字的排列(输入)顺序,数组是0、1、2、……这样排列的,下标越靠近0,位数越大。例如123,下标0是百位,下标1是十位,下标3是个位。但是,数组不应当这样放,而是应当倒过来——个位放在下标0,十位放在下标1,位数越大,下标越大。因为不这样放的话,假如最高位有进位,按照最高位下标是0的规则,那最高位的进位的下标是否就成了-1呢?即使一开始预留了进位的下标,也没有一开始就倒过来方便。
2、输入的数字最大是两百位,那输出的数字最大也是两百位吗?错!还得考虑最高位进位问题!所以,存放结果的数组的大小不应当是200,而是201,这是个坑!综合第一点中的3,干脆就把所有的大小都不要设在200或201了,都离200稍微远一点,比如210,就万事大吉了。

三、加法
注意点:
1、加法唯一要注意的就是进位问题。处理起来也挺简单:如果要进位,那么先当前位-10,然后当前位的高位+1。不过注意:既然高位加了1,那么最高位的结果除了原来的结果,还得加上它自己(即自加),因为刚刚高位+1表示有进位了呀。

四、去零
注意点:
1、一开始很疑惑为什么要给数组赋初值为0呢?直到看到运行结果的正确结果前面有一堆乱码的时候知道了为什么。这有可能是因为把字符串中的‘\0’也给赋值到了数组中去。顺便一提:字符串如果没有输满的话,空的那些格里放的都是\0。此时sizeof的值会把所有的\0全都算进去,就成了字符串的长度:201.

五、输出
注意点:
1、要从高位往地位找到第一个非零的数字,从这个数字开始往低位输出。找法很简单:设置一个int型变量,它的值就是第一个非零的下标。输出时用for循环,就从这个下标开始。

参考文章:
C语言大整数加法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值