ACM 大数加法

74 篇文章 0 订阅

大数加法

Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByte
Total Submit:1989            Accepted:522

Description

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

Input

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

Output

两个非负整数的和。

Sample Input

111111111111 222222222222

Sample Output

333333333333

Hint

 

Source

GUOJ


分析:C++最大_int64也不够放大数的,所以肯定是用数组来进行大数运算。一开始就卡在怎么输入上了。如果输入数据一行一个,那就可以很简单的用gets()来获取字符串。然而现在是一行用空格分隔输入2个数,这种方法也不是不行,只是繁琐一些(一股脑儿冲到底吧),用gets后,判断是否为空格,不是的话就利用getchar()一个一个将字符输入到char型数组,之后再。。。

显然。略麻烦。

当然,最简单的是:

scanf("%s %s",&s1,&s2); //抓狂中!!!

之后思路很清晰,可以将char型数组转换成int型数组,再循环加,只需注意进位即可。

不过还是有一点小窍门,因为大数小于1000位,和数组(sum数组)最大位数和两个int数组一样。PS:数组用了1000方便,其实严格的话是999。如果两个数都为999位且相加最高位要进位,例如9999...+9999...,只需判断最后一次相加要不要进位,若需进位,则单独输出一个1。这样就快捷了。

结果是,偶然的写法其实大有内涵:

由于数组相加循环最大是 数组a和数组b中下标最大的,所以所有最高位要进位的话,都是要人工输出的,即如果2个大数相同个数且最高位要进位,都会主动先输出一个1。

这个小题目基本就做完了。关于数组加法还有很多写法,关键是进位carry有很多判定。

贴上很nice的代码:^_^


#include<stdio.h>
#include<string.h>

//大数加法 1000位以内

int main()
{
	char s1[1000]; char s2[1000];  
	int a[1000] = {0}; int b[1000] = {0}; int sum[1000] = {0};  // 第1000位 进位单独考虑
	scanf("%s %s",&s1,&s2);
	int lenA = strlen(s1) - 1; // 最大下标
	int lenB = strlen(s2) - 1;
	// 转换成 int , 逆序,a[0]为个位...
	int k = 0;
	for(int i=lenA;i>=0;i--)
	{
		a[k] = s1[i] - '0';
		k++;
	}
	k = 0;
	for(int i=lenB;i>=0;i--)
	{
		b[k] = s2[i] - '0';
		k++;
	}
	
	int carry = 0; // 进位标志
	for(int i=0;i<=(lenA>lenB ? lenA : lenB);i++) // 0~lenA与lenB中大的一个
	{
		int tmp1 = a[i] + b[i] +carry;
		sum[i] = tmp1%10;
		if(tmp1 >=10) 
			carry = 1;
		else 
			carry = 0;
	}
	if(carry == 1) printf("1"); // 最高位进位了 单独输出1
	for(int i=(lenA>lenB ? lenA : lenB);i>=0;i--)
		printf("%d",sum[i]);
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值