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

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

输入:987654321987654321,987654321987654321

答案:1975308643975308642

输入:9999999999999999999(20个9),9

答案:100000000000000000008
请务必于6月14日18:00之前回答。
展开
 我来答
这是我小号V5
推荐于2018-01-30 · TA获得超过186个赞
知道小有建树答主
回答量:141
采纳率:50%
帮助的人:90万
展开全部
#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,先将这两个
  *字符串逆转并且分位保存到两个整型数组里面(因为做加法时
  *从低位开始相加),然后就和手工算法一样依次相加。
  */
流星不死
2014-06-13 · TA获得超过1662个赞
知道小有建树答主
回答量:1621
采纳率:0%
帮助的人:1315万
展开全部
# 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;
}

 没仔细研究

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
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

最后再反回来
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
圣鸾OJ
2015-09-29 · TA获得超过1629个赞
知道小有建树答主
回答量:1136
采纳率:96%
帮助的人:112万
展开全部
#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,先将这两个
*字符串逆转并且分位保存到两个整型数组里面(因为做加法时
*从低位开始相加),然后就和手工算法一样依次相加。
*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
出户老人言1
2018-01-30
知道答主
回答量:1
采纳率:0%
帮助的人:905
展开全部
#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;}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式