大家好,我是一名刚接触c语言不久的大一新生,这是我的第一篇博客:关于大正整数的加法
我们都知道整型变量即使是长整型表示数字的范围也非常有限,因此我们可以用字符数组保存大正整数,然后模拟手工运算实现两个大整数的加法。
简单思路为:将两个大正整数存入字符数组,然后整体向字符数组的尾端对齐,然后从后往前进行加法运算,并将结果保存在第三个字符数组,然后将前面多余的’0’处理掉。
代码如下:
#include<stdio.h>
#include<string.h>
#define max 100
/*max为我们用到的大正整数的最大位数+1,考虑到字符串的最后一个'\0',如这里我们用的最大位数为99*/
int main()
{
char a[max],b[max],c[max];
int i,j,k;
/*以读入字符串的方式输入两个我们需要进行加法运算的两个大正整数,并实现多组输入*/
while(scanf("%s%s",a,b)!=EOF){
/*将存储结果的字符数组初始化为'0'*/
for(i = 0;i<max-1;i++)
c[i] = '0';
c[max-1] = '\0';
/*找到字符数组a的最后一个字符,然后整体移到字符数组尾*/
for(i = 0; a[i]; i++);
j = i-1;
k = max-2;
for(;i<max-1;i++)
a[i] = '0';
i = j;
for(;i>=0;i--){
a[k] = a[i];
k--;
a[i] = '0';
}a[max-1] = '\0';
/*对字符数组b进行与上相同的操作*/
for(i = 0;b[i];i++);
j = i-1;
k = max-2;
for(;i<max-1;i++)
b[i] = '0';
i = j;
for(;i>=0;i--){
b[k] = b[i];
k--;
b[i] = '0';
}b[max-1] = '\0';
/*开始进行加法运算*/
for(i = max-2;i>=0;i--){
/*因为我们字符数组存的每一个元素都是字符而不是数字,因此必须注意+-'0'的细节*/
c[i] = c[i]+a[i]+b[i]-'0'-'0';
j = i;
/*进位处理*/
if((c[j]-'0')>9){
c[j] = (c[j] - '0')%10+'0';
c[j-1]++;
}
}
/* 处理前面多余的'0':找到第一个不是'0'的元素,然后从该位置开始整体向前移并在结尾添上'\0',大正整数相加的结果就出来了*/
for(i = 0;c[i]=='0';i++);
j = i;
for(k = 0;i<=max-2;i++){
c[k++] = c[i];
c[i] = '0';
}c[max-1-j] = '\0';
printf("%s\n",c);
}
return 0;
}
以上就是我的想法与做法,欢迎大家改进,希望能有用吧。