C语言“字符串大整数加法”这题怎么做?
请按要求帮我编下程序:在实际的工程应用中常常出现超过系统整型数据类型表示范围的大整数,所以有必要研究大整数在程序中的处理方法。请编制程序实现功能:利用字符数组实现两个大整...
请按要求帮我编下程序:
在实际的工程应用中常常出现超过系统整型数据类型表示范围的大整数,所以有必要研究大整数在程序中的处理方法。请编制程序实现功能:利用字符数组实现两个大整数的加法。
输入:987654321987654321,987654321987654321
答案:1975308643975308642
输入:9999999999999999999(20个9),9
答案:100000000000000000008
请务必于6月14日18:00之前回答。 展开
在实际的工程应用中常常出现超过系统整型数据类型表示范围的大整数,所以有必要研究大整数在程序中的处理方法。请编制程序实现功能:利用字符数组实现两个大整数的加法。
输入:987654321987654321,987654321987654321
答案:1975308643975308642
输入:9999999999999999999(20个9),9
答案:100000000000000000008
请务必于6月14日18:00之前回答。 展开
5个回答
展开全部
#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,先将这两个
*字符串逆转并且分位保存到两个整型数组里面(因为做加法时
*从低位开始相加),然后就和手工算法一样依次相加。
*/
展开全部
# 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
最后再反回来
我的想法是定义来好字符串 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
最后再反回来
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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,先将这两个
*字符串逆转并且分位保存到两个整型数组里面(因为做加法时
*从低位开始相加),然后就和手工算法一样依次相加。
*/
#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,先将这两个
*字符串逆转并且分位保存到两个整型数组里面(因为做加法时
*从低位开始相加),然后就和手工算法一样依次相加。
*/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;}
}
#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;}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询