c语言程序设计——计算数值较大的a+b 30
Calculate a+b
Input
Two integer a,b (0<=a,b<=1000000000000000000000000000000)
Output
Output a+b
Sample Input
1 2
Sample Output
3 展开
#include<stdio.h>
#include<string.h>
void main()
{
int b[500]={0},a[500]={0};
char c[500],d[500];
printf("Input a\n");
gets(d);
for(int i=0;i<strlen(d);i++)
if(d[i]<48||d[i]>58)
{
printf("Wrong Input\n");
return;
}
else
{
a[499-i]=d[strlen(d)-i-1]-48;
}
printf("Input b\n");
gets(c);
for(i=0;i<strlen(c);i++)
if(c[i]<48||c[i]>58)
{
printf("Wrong Input\n");
return;
}
else
{
b[499-i]=c[strlen(c)-i-1]-48;
}
for(i=0;i<500;i++)
a[i]=a[i]+b[i];
for(i=499;i>0;i--)
{
if(a[i]>9)
{
a[i-1]+=a[i]/10;
a[i]%=10;
}
}
printf("a + b = ");
for(i=0;a[i]==0;i++);
for(;i<500;i++)
printf("%d",a[i]);
printf("\n");
}
输入ab
char a[2000]={0},b[2000]={0},c[2000]={0};
这里ab需要先全部赋值为零,要不然长度不一样的话,会有随机数干扰计算
gets(a);
gets(b);
球长度
la=strlen(a);
lb=strlen(b);
lc=la>lb?la:lb;
反序,这样个位才能对应上,个位对个位,百位对百位
strrev(a);
strrev(b);
先计算个位 需要变成int型
c[0]=a[0]+b[0]-96;
再计算中间个位
for(i=1;i<lc;i++)
{
c[i]=a[i]+b[i]-96+c[i-1]/10; 需要加上上一位的进位
c[i-1]%=10; 取出每位的个位
c[i-1]+=48; //变成char型
}
最后处理最高位
while(c[lc-1]>9)
{
c[lc-1]+=38;
c[lc]=49; 变成char的1 两个数相加最大为9+9+1,1是进位
lc++;
}
最后反序回来,也可以从后面打印
strrev(c);
puts(c)
#define MAXVALUE 10000
typedef struct
{
int v[MAXLENTH];
} VeryLongInt;
VeryLongInt *Add2(VeryLongInt *a,const VeryLongInt *b)
{
int i;
int carry=0;
if(a==b )
{
for(i=0;i<MAXLENTH;i++)
{
a->v [i]<<=1;
a->v[i]+=carry;
if(a->v [i]>=MAXVALUE)
{ a->v [i]-=MAXVALUE;
carry=1;
}
else carry=0;
}
return a;
}
for(i=0;i<MAXLENTH;i++)
{
a->v [i]+=b->v [i];
a->v [i]+=carry;
if(a->v [i]>=MAXVALUE)
{ a->v [i]-=MAXVALUE;
carry=1;
}
else carry=0;
}
return a;
}
VeryLongInt *Add(VeryLongInt *c,const VeryLongInt *a,const VeryLongInt *b)
{
int i;
int carry=0;
if(c==a )
{
return Add2(c,b);
}
else if(c==b)
{
return Add2(c,a);
}
for(i=0;i< MAXLENTH;i++)c->v[i]=0;
for(i=0;i<MAXLENTH;i++)
{
c->v[i] =a->v[i]+b->v[i];
c->v[i]+=carry;
if(c->v[i]>=MAXVALUE)
{
c->v[i]-=MAXVALUE;
carry =1;
}
else
{
carry=0;
}
}
return c;
}
int printVeryLongInt(const VeryLongInt *a)
{
int i;
for(i=MAXLENTH-1;i>0 ;i--){
if(a->v[i])break;
}
if(i==0){
printf("%4d",a->v[i]);
return i;
}
printf("%4d",a->v[i--]);
for(;i>=0;i--)
{
printf("%04d",a->v[i]);
}
printf("\n",a->v[i--]);
return i;
}
INT64 add(INT64 a,INT64 b)
{
return a+b;
}