C语言“字符串大整数加法”这题怎么做?

请按要求帮我编下程序:
在实际的工程应用中常常出现超过系统整型数据类型表示范围的大整数,所以有必要研究大整数在程序中的处理方法。请编制程序实现功能:利用字符数组实现两个大整数的加法。

输入:987654321987654321,987654321987654321

答案:1975308643975308642

输入:9999999999999999999(20个9),9

答案:100000000000000000008
请务必于6月14日18:00之前回答。

#include<stdio.h>
#include<string.h>
#define MAXD 100
int main()
{
    char str1[MAXD],str2[MAXD];     //用于保存键盘输入的两个待加大整数
    int num1[MAXD],num2[MAXD];
    while(1)
    {
        memset(str1,0,sizeof(str1));
        memset(str1,0,sizeof(str2));
        memset(num1,0,sizeof(num1));
        memset(num2,0,sizeof(num2));//将这些数组清零
        scanf("%s",str1);
        scanf("%s",str2);
        int len1,len2,i,j;
        len1=strlen(str1);
        len2=strlen(str2);
        j=0;
        int max=len1>len2?len1:len2;
        for(i=len1-1; i>=0; i--)
            num1[j++]=str1[i]-'0';
        /*字符串反转并且转换为数字保存到数组里面*/
        j=0;
        for(i=len2-1; i>=0; i--)
            num2[j++]=str2[i]-'0';
        for(i=0; i<max; i++)
        {
            num2[i]+=num1[i];//相加
            if(num2[i]>=10)
            {
                num2[i]-=10;
                num2[i+1]+=1;//产生进位
            }
        }
        if(num2[max]) printf("%d",num2[max]);//如果最高位产生进位
        for(i=max-1; i>=0; i--)
            printf("%d",num2[i]);
        printf("\n");
    }
    return 0;
}
/*
  *过程如下,假设输入两个字符串123456和987654,先将这两个
  *字符串逆转并且分位保存到两个整型数组里面(因为做加法时
  *从低位开始相加),然后就和手工算法一样依次相加。
  */

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-06-13
# include <stdio.h>
# include <string.h>


int main(){
char str1[1000],str2[1000];
char str3[1000],str4[1000];
char result[1000];
char result2[1000];
int k1,k2,i,c = 0,k3 = 0,k4 = 0,temp,j;
scanf("%s,%s",str1,str2);
k1 = strlen(str1);
k2 = strlen(str2);
for(i=k1-1;i>=0;i--)
str3[k3++] = str1[i];
for(i=k2-1;i>=0;i--)
str4[k4++] = str2[i];
str3[k3] = 0;
str4[k4] = 0;
//puts(str3);
//puts(str4);

for(i=0;str3[i]&&str4[i];i++)
{
temp = (str3[i]-48)+(str4[i]-48)+c;
if(temp<10)
{
result[i] = temp+48;
c = 0;
}
else
{
result[i] = temp-10+48;
c = 1;
}

}
if(k3>k4)
{
for(j=i;str3[j];j++)
{
result[j] = str3[j]+c;
c = 0;
}
}
else
{
for(j=i;str4[j];j++)
{
result[j] = str4[j]+c;
c = 0;
}
}

result[j] = 0;
//puts(result);
c = 0;
for(i=strlen(result)-1;i>=0;i--)
{
result2[c++] = result[i];
}
result2[c] = 0;
printf("%s",result2);

return 0;
}

 没仔细研究

第2个回答  2014-06-13
分长一倍,会有好多人来抢着做啊

我的想法是定义来好字符串 a[N],b[N],c[N],

再定义一个 flag标记是不是进位,初始值是零

反转顺序,比如输入的是 123456,反转后变成 654321
就是让个位数刚好在 a[0]位置

for循环,直到两个数都到最高位

tmp=a[i]+b[i]-'0'-'0';
c[i]=tmp%10+flag
flat=tmp/10

最后再反回来
第3个回答  2015-09-29
#include<stdio.h>
#include<string.h>
#define <a href="https://www.baidu.com/s?wd=MAX&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3nHndPj79PHTkrjRzPW9B0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DLPWmYrjbsPWmsnjDLPWmznW0" target="_blank" class="baidu-highlight">MAX</a>D 100
int main()
{
char str1[<a href="https://www.baidu.com/s?wd=MAX&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3nHndPj79PHTkrjRzPW9B0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DLPWmYrjbsPWmsnjDLPWmznW0" target="_blank" class="baidu-highlight">MAX</a>D],str2[<a href="https://www.baidu.com/s?wd=MAX&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3nHndPj79PHTkrjRzPW9B0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DLPWmYrjbsPWmsnjDLPWmznW0" target="_blank" class="baidu-highlight">MAX</a>D]; //用于保存键盘输入的两个待加大整数
int num1[MAXD],num2[MAXD];
while(1)
{
memset(str1,0,sizeof(str1));
memset(str1,0,sizeof(str2));
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));//将这些数组清零
scanf("%s",str1);
scanf("%s",str2);
int len1,len2,i,j;
len1=strlen(str1);
len2=strlen(str2);
j=0;
int max=len1>len2?len1:len2;
for(i=len1-1; i>=0; i--)
num1[j++]=str1[i]-'0';
/*字符串反转并且转换为数字保存到数组里面*/
j=0;
for(i=len2-1; i>=0; i--)
num2[j++]=str2[i]-'0';
for(i=0; i<max; i++)
{
num2[i]+=num1[i];//相加
if(num2[i]>=10)
{
num2[i]-=10;
num2[i+1]+=1;//产生进位
}
}
if(num2[max]) printf("%d",num2[max]);//如果最高位产生进位
for(i=max-1; i>=0; i--)
printf("%d",num2[i]);
printf("\n");
}
return 0;
}
/*
*过程如下,假设输入两个字符串123456和987654,先将这两个
*字符串逆转并且分位保存到两个整型数组里面(因为做加法时
*从低位开始相加),然后就和手工算法一样依次相加。
*/
第4个回答  2018-01-30
#include <stdio.h>
#include <string.h>
int a[201],b[201];
char c[201];
int main()
{
int s1,s2,s,i,k=0;
scanf("%s",c);
s1=strlen(c);
s=s1;
for(i=0;i<s1;i++)
a[i+1]=c[s1-i-1]-48;
memset(c,0,sizeof(c));
scanf("%s",c);
s2=strlen(c);
for(i=0;i<s2;i++)
b[i+1]=c[s2-i-1]-48;
if(s2>s1)s=s2;
for(i=1;i<=s;i++)
{
a[i]+=b[i];
if(a[i]>=10){
a[i]-=10;
a[i+1]++;
}
}
for(i=s+1;i>=1;i--)
if(a[i]!=0||k==1||i==1){printf("%d",a[i]);k=1;}
}
相似回答