引言
由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 ,大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算
思想
1.先用两个字符数组来存储输入的大数
2.我们可以确定结果的位数一定不会比输入的最大位数的大数的位数+1还要多
3.根据数组存储数据的特性,比如一个8位数,个位数在num[7]的位置,所以我们要进行倒序相加,进行逢十进一也是利用循环,倒序相加
4.但是要注意,只有当两个数都有的时候才相加,一个数不存在的时候,直接写入结果
5.最后判断存储结果的数组的第一位是不是0,如果是,则证明位数没有改变,则每一位要前挪一位
6.不管用不用前挪,我们都要在结果的最后加’\0’,以至于能当成字符串输出
代码实现
#include<stdio.h>
#include<string.h>
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;
}