大数运算--加法

引言

由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 ,大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算

思想

1.先用两个字符数组来存储输入的大数
2.我们可以确定结果的位数一定不会比输入的最大位数的大数的位数+1还要多
3.根据数组存储数据的特性,比如一个8位数,个位数在num[7]的位置,所以我们要进行倒序相加,进行逢十进一也是利用循环,倒序相加
4.但是要注意,只有当两个数都有的时候才相加,一个数不存在的时候,直接写入结果
5.最后判断存储结果的数组的第一位是不是0,如果是,则证明位数没有改变,则每一位要前挪一位
6.不管用不用前挪,我们都要在结果的最后加’\0’,以至于能当成字符串输出

代码实现

#include
#include
int main(){
	char num1[1005]={0},num2[1005]={0},num[1005]={0};
	int len1,len2,len;//长度
	int i;
	printf("请输入第一个数\n");
	scanf("%s",num1);
	getchar();
	printf("请输入第二个数\n"); 
	scanf("%s",num2);
	getchar();
	
	//计算两个数的位数以及结果的最大位数 2
	len1=strlen(num1);
	len2=strlen(num2);
	len=len1>len2?len1:len2;
	len++;
	
	//倒序相加直到小的数被加完为止 
	for(i=0;i<len1&&i<len2;i++)
		num[len-1-i]=(num1[len1-1-i]-'0')+(num2[len2-1-i]-'0');
	
	//找出大的数直接赋值进result 
	if(len1>len2){
		for(;i<len1;i++)
			num[len-1-i]=num1[len1-1-i]-'0';
	}
	else{
		for(;i<len2;i++)
			num[len-1-i]=num2[len2-1-i]-'0';
	}
	
	//倒序判断,逢十进一
	for(i=len-1;i>0;i--){
		if(num[i]>=10){
			num[i]=num[i]%10;
			num[i-1]++;
		}
	}
	
	//判断相加有没有使最大位数改变,如果没有就要前移一位
	if(num[0]==0){
		for(i=1;i<len;i++){
			num[i-1]=num[i]+'0';
		}
		num[len-1]='\0';
	} 
	else{
		for(i=0;i<len;i++){
			num[i]=num[i]+'0';
		}
		num[len]='\0';
	}
	printf("两个数相加的结果是:\n");
    puts(num);
	return 0;
}

你可能感兴趣的:(大数运算--加法)