超长整数加法
【问题描述】
编写程序用递归的方式实现两个超长整数的加法运算。
【输入形式】
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083),同时还要考虑负整数前导的“-”号。 1. 第一行是超长整数A; 2. 第二行是超长整数B。
【输出形式】
输出只有一行,是长整数A加上长整数B的运算结果,从高到低依次输出各位数字。要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。
【输入样例】
234098
-134098703578230056
【输出样例】
-134098703577995958
C语言 超长整数加法
答案:3 悬赏:0
解决时间 2021-04-22 22:59
- 提问者网友:冷场帝
- 2021-04-22 01:43
最佳答案
- 二级知识专家网友:转身→时光静好
- 2021-04-22 02:32
以前我也做过一个大整数程序,2000!,不过那里面没有减法。做这个减法真让花时间啊。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 4000
dd(char *a)
{
char t[MAX];
int i,j;
for(i=0;i<MAX;i++)
{
if(a[i]==NULL)
{
for(j=0;i>0;j++,i--)
{
t[j]=a[i-1];
}
strncpy(a,t,j);
break;
}
}
}
add1(char *a,char *b,int n,char *c)
{
int N;
if(*a!=NULL&&*b!=NULL)
N=*a-'0'+*b-'0'+n;
else if(*a==NULL&&*b!=NULL)
N=*b-'0'+n;
else if(*a!=NULL&&*b==NULL)
N=*a-'0'+n;
else
N=n;
*c=(N%10)+'0';
N=N/10;
if(*(a+1)!=NULL||*(b+1)!=NULL||N!=0)
{
add1(a+1,b+1,N,c+1);
}
}
addab(char *a,char *b,char *c)
{
dd(a);
dd(b);
dd(c);
add1(a,b,0,c);
dd(a);
dd(b);
dd(c);
}
d_(char *a)
{
int i;
for(i=0;a[i]!=NULL;i++)
{
a[i]=a[i+1];
}
}
udg1(char *a,char *b,int n,char *c)
{
int N;
if(*b==NULL)
{
N=*a-'0'-n;
n=0;
}
else
{
if(*a>=(*b+n))
{
N=*a-*b-n;
n=0;
}
else
{
N=*a+10-*b-n;
n=1;
}
}
*c=N+'0';
if(*(a+1)!=NULL)
udg1(a+1,b+1,n,c+1);
}
udg(char *a,char *b,char *c)
{
int i;
if((strcmp(a,b)>0&&strlen(a)==strlen(b))||strlen(a)>strlen(b))
i=1;
else if((strcmp(a,b)<0&&strlen(a)==strlen(b))||strlen(b)>strlen(a))
i=-1;
else
i=0;
dd(a);
dd(b);
dd(c);
if(i==1)
udg1(a,b,0,c);
else if(i==-1)
{
udg1(b,a,0,c);
for(i=0;i<MAX;i++)
{
if(c[i]==NULL)
{
c[i]='-';
break;
}
}
}
else
*c='0';
dd(a);
dd(b);
dd(c);
}
add_(char *c)
{
int i;
char t1,t2;
t1=c[0];
t2=c[1];
c[0]='-';
for(i=1;t1!='\0';i++)
{
c[i]=t1;
t1=t2;
t2=c[i+1];
}
}
main()
{
char a[MAX]={NULL},b[MAX]={NULL},c[MAX]={NULL};
printf("输入两个数:\n");
scanf("%s",a);
getchar();
scanf("%s",b);
getchar();
if(a[0]!='-'&&b[0]!='-')
{
addab(a,b,c);
}
else
{
if(a[0]=='-'&&b[0]!='-')
{
d_(a);
udg(b,a,c);
}
else if(a[0]!='-'&&b[0]=='-')
{
d_(b);
udg(a,b,c);
}
else
{
d_(b);
d_(a);
addab(a,b,c);
add_(c);
}
}
printf("%s\n",c);
getchar();
}
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 4000
dd(char *a)
{
char t[MAX];
int i,j;
for(i=0;i<MAX;i++)
{
if(a[i]==NULL)
{
for(j=0;i>0;j++,i--)
{
t[j]=a[i-1];
}
strncpy(a,t,j);
break;
}
}
}
add1(char *a,char *b,int n,char *c)
{
int N;
if(*a!=NULL&&*b!=NULL)
N=*a-'0'+*b-'0'+n;
else if(*a==NULL&&*b!=NULL)
N=*b-'0'+n;
else if(*a!=NULL&&*b==NULL)
N=*a-'0'+n;
else
N=n;
*c=(N%10)+'0';
N=N/10;
if(*(a+1)!=NULL||*(b+1)!=NULL||N!=0)
{
add1(a+1,b+1,N,c+1);
}
}
addab(char *a,char *b,char *c)
{
dd(a);
dd(b);
dd(c);
add1(a,b,0,c);
dd(a);
dd(b);
dd(c);
}
d_(char *a)
{
int i;
for(i=0;a[i]!=NULL;i++)
{
a[i]=a[i+1];
}
}
udg1(char *a,char *b,int n,char *c)
{
int N;
if(*b==NULL)
{
N=*a-'0'-n;
n=0;
}
else
{
if(*a>=(*b+n))
{
N=*a-*b-n;
n=0;
}
else
{
N=*a+10-*b-n;
n=1;
}
}
*c=N+'0';
if(*(a+1)!=NULL)
udg1(a+1,b+1,n,c+1);
}
udg(char *a,char *b,char *c)
{
int i;
if((strcmp(a,b)>0&&strlen(a)==strlen(b))||strlen(a)>strlen(b))
i=1;
else if((strcmp(a,b)<0&&strlen(a)==strlen(b))||strlen(b)>strlen(a))
i=-1;
else
i=0;
dd(a);
dd(b);
dd(c);
if(i==1)
udg1(a,b,0,c);
else if(i==-1)
{
udg1(b,a,0,c);
for(i=0;i<MAX;i++)
{
if(c[i]==NULL)
{
c[i]='-';
break;
}
}
}
else
*c='0';
dd(a);
dd(b);
dd(c);
}
add_(char *c)
{
int i;
char t1,t2;
t1=c[0];
t2=c[1];
c[0]='-';
for(i=1;t1!='\0';i++)
{
c[i]=t1;
t1=t2;
t2=c[i+1];
}
}
main()
{
char a[MAX]={NULL},b[MAX]={NULL},c[MAX]={NULL};
printf("输入两个数:\n");
scanf("%s",a);
getchar();
scanf("%s",b);
getchar();
if(a[0]!='-'&&b[0]!='-')
{
addab(a,b,c);
}
else
{
if(a[0]=='-'&&b[0]!='-')
{
d_(a);
udg(b,a,c);
}
else if(a[0]!='-'&&b[0]=='-')
{
d_(b);
udg(a,b,c);
}
else
{
d_(b);
d_(a);
addab(a,b,c);
add_(c);
}
}
printf("%s\n",c);
getchar();
}
全部回答
- 1楼网友:哭不代表软弱
- 2021-04-22 05:03
#include #include #define n 250 int maxlen(int x,int y) { if(x>y) { return x; } else { return y; } } int main() { int i,j,k,l1,l2,a[n],b[n],max,s,sum; char s1[n],s2[n]; for(i=0;i=0;i--,j--) { a[i]=s1[j]-'0'; } for(i=k,j=l2-1;j>=0;i--,j--) { b[i]=s2[j]-'0'; } for(i=k;i>0;i--) { a[i]+=b[i]; if(a[i]>=10) { a[i]-=10; a[i-1]++; } } if(a[0]!=0) {for(i=0;i<=k;i++) { printf("%d",a[i]); } } else { for(i=1;i<=k;i++) { printf("%d",a[i]); } } return 0; } //没有测试组数 自己看着加上就行了
- 2楼网友:偏爱自由
- 2021-04-22 03:44
你看看大数运算就都会了
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯