大整数加法

描述

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

输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
参考代码:
#include <stdio.h>
#include <string.h>
#define MAX_LEN 201
int an1[MAX_LEN+10];
int an2[MAX_LEN+10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];
int Add(int nMaxLen , int * an1, int * an2)
//将长度最多为 nMaxLen 的大整数 an1和an2 相加,结果放在an1, 
//an1[0],an2[0]对应于个位
{
	int nHighestPos = 0;
	for(int i = 0;i < nMaxLen; i ++ ) {	
		an1[i] += an2[i];		//逐位相加
		if( an1[i] >= 10 ) {		//看是否要进位	
			an1[i] -= 10;
			an1[i+1] ++;			//进位
		}
		if( an1[i] )
			nHighestPos = i; //记录最高位的位置
	}
	return nHighestPos;
}
int main()   {
	scanf("%s", szLine1);  
	scanf("%s", szLine2);
	int i, j;
	//库函数memeset将地址an1开始的sizeof(an1)字节内容置成0
	//sizeof(an1)的值就是an1的长度
	//memset函数在string.h中声明
	memset( an1, 0, sizeof(an1));	
	memset( an2, 0, sizeof(an2));
	//下面将szLine1中存储的字符串形式的整数转换到an1中去,
	//an1[0]对应于个位
	int nLen1 = strlen( szLine1);
	for(j =0, i = nLen1 - 1;i >= 0 ; i --)
		an1[j++] = szLine1[i] - '0';	
	int nLen2 = strlen(szLine2);
	for(j=0, i = nLen2 - 1;i >= 0 ; i --)
		an2[j++] = szLine2[i] - '0';
	int nHighestPos = Add(MAX_LEN,an1,an2);	
	for( i = nHighestPos; i >= 0; i -- )  
		printf("%d", an1[i]);
	return 0;
}


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页