信息学奥赛一本通:1168:大整数加法

1168:大整数加法


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 76804     通过数: 25726 

【题目描述】

求两个不超过200位的非负整数的和。

【输入】

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

22222222222222222222
33333333333333333333

【输出样例】

55555555555555555555

写得很繁

肯定以字符串的形式计算和保存,输出

#include<iostream>
#include<cmath> 
#include<cstring>
char a[205],b[205],c[205];//c是计算字串
using namespace std;
int main()
{
	int m=0,n,i=0,j=0,k=0,sum;
scanf("%s %s",&a,&b);
while(a[i]=='0')//开始的0不计
{
	i++;
}
m=strlen(a);//字串长度
for(j=0;i<m;i++,j++)//从i开始,放在c中
c[j]=a[i];
c[j]='\0';
strcpy(a,c);//复制到a
m=strlen(a);//再求长度
i=0;
while(b[i]=='0')//重复上面的步骤
{
	i++;
}
n=strlen(b);
for(j=0;i<n;i++,j++)
c[j]=b[i];
c[j]='\0';
strcpy(b,c);
n=strlen(b);
if(m<n)//长的字符串放在a中,另一个在b中
{
	strcpy(c,a);
	strcpy(a,b);
	strcpy(b,c);
	sum=m;
	m=n;
	n=sum;
}
for(i=m-1,j=n-1;j>=0;j--,i--)//从字串的末尾开始计算,即个位开始
{
	if(k==1)//进位了吗
	a[i]++;
	k=0;
	a[i]=a[i]-'0'+b[j]-'0';//字符相加
	if(a[i]>=10){//有进位吗
	a[i]=a[i]-10;
	k=1;
		}
	a[i]+='0';//转换为字符
}
if(i>-1&&k==1)//处理最后一位的进位
{
	a[i]++;
	k=0;
}
if(k==1)//如果最后还有进位,如果去掉这两行,程序也能通过,但实际不正确,如789+789
printf("%d",1);
printf("%s",a);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值