您的位置:首页 > 其它

刷题第五天:南邮NOJ【1011大数加法】

2016-05-02 01:59 483 查看
大数加法
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536KByte

总提交 : 3359 测试通过 : 877

比赛描述

求两个非负整数(1000位以内)的和。

输入

两个非负整数(1000位以内),以空格分隔。

输出

两个非负整数的和。

样例输入

111111111111 222222222222

样例输出

333333333333

提示

题目来源

GUOJ

来自 <http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1011>

#include <stdio.h>

#include <string.h>

int main()

{

char num1[1001];//存放第一组数据

char num2[1001];//存放第二组数据

int sum[1005];//存放计算结果

int a=0,b=0,i,c=0,flag=0;//flag进位标志初始化为0

scanf("%s",num1);//将第一组数据放入数组

scanf("%s",num2);

a=strlen(num1);//计算数据长度

b=strlen(num2);

if(a>=b)//分两种情况,sum数组的存放长度由a,b中大的一个决定

{

for(i=0;i<a;i++)//循环计算到第a-1位

{

if(i<b)//此情况为两组数据在同一下标位上都有数据

{

c=num1[a-i-1]-'0'+num2[b-i-1]-'0'+flag;

flag=0;//将标志清零,以免影响后续计算

if(c>=10)//判断若大于10则发生进位

{

flag=1;//标志置1

sum[i]=c%10;//对该位取余

}

else//否则直接赋值

sum[i]=c;

}

else//此情况为在该下标位上只有第一组数组有值

{

c=num1[a-i-1]-'0'+flag;

flag=0;

if(c>=10)

{

flag=1;

sum[i]=c%10;

}

else

sum[i]=c;

}

}

if(flag)//考虑到如55+65这种情况将新开辟一个字节

{

sum[i]=1;

a++;

}

for(i=a-1;i>=0;i--)

printf("%d",sum[i]);

}

else

{

for(i=0;i<b;i++)

{

if(i<a)

{

c=num2[b-i-1]-'0'+num1[a-i-1]-'0'+flag;

flag=0;

if(c>=10)

{

flag=1;

sum[i]=c%10;

}

else

sum[i]=c;

}

else

{

c=num2[b-i-1]-'0'+flag;

flag=0;

if(c>=10)

{

flag=1;

sum[i]=c%10;

}

else

sum[i]=c;

}

}

if(flag)//考虑到如94+6这种情况也将新开辟一个字节

{

sum[i]=1;

b++;

}

for(i=b-1;i>=0;i--)

printf("%d",sum[i]);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: