超大数的加法计算(我的第一篇博客)
Description
求a+b的值 Input 第一行一个整数T,表示接下来有T行
每行两个整数是a,b,(0<=a,b<=10^10000)
Output 输出值
Sample Input
2
100 100
10000000000 10000000000
Sample Output
200
20000000000
/*
现在补一个C++版本的
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char a[10005],b[10005],c[10005];
int len,def;
void inline addZero(int lena,int lenb,char *p)
{
memset(c,'\0',sizeof(c));
len = lena;
def = lena - lenb;
fill(c,c+def,'0');
strcat(c,p);
memset(p,'\0',sizeof(p));
strcpy(p,c);
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
cin>>a>>b;
int lena = strlen(a);
int lenb = strlen(b);
if(lena!=lenb)
lena > lenb?addZero(lena,lenb,b):addZero(lenb,lena,a);
else
len = lena;
int k = 0,t = 0;
memset(c,'\0',sizeof(c));
for(int i = len-1; i>=0; i--)
{
int x = (a[i]-'0')+(b[i]-'0')+t;
t = x / 10;
c[k++] = x%10+'0';
}
if(t)
c[k++] = t+'0';
for(int i = k-1; i >= 0; i--)
cout<<c[i];
cout<<endl;
}
return 0;
}
/*
下面是入门的时候写的代码
*/
1
计算超大数跟我们手算一个道理
#include<stdio.h>
#include<string.h>
int max2(int m,int n)
{
return m>n?m:n;
}//判断两个数更大的数函数,减少if的使用
int def(int s,int w)
{
return s>w?s-w:w-s;
}//求差函数
int main()
{
char a[10005]= {'0'},b[10005]= {'0'};
int c[15000]= {0}; //必要的初始化操作
int T;
scanf("%d",&T);
while(T--)
{
int i=0,j=0,k,f,g;
int x,y,l,p,q=0;
scanf("%s %s",a,b);
x=strlen(a),y=strlen(b);
l=max2(x,y),f=def(x,y);
if(x==y)//如果两个超大数位数相同
{
for(i=x-1; i>0; i--)
{
p=(a[i]-'0')+(b[i]-'0')+q;
c[j]=p%10;
q=p/10;//进位
j++;
} //上面按手算法算到倒数第二位
// 再算最后一位,值直接存到下一个数组元素格
c[j]=(a[0]-'0')+(b[0]-'0')+q;
for(k=j; k>=0; k--)
{
printf("%d",c[k]);//逆序输出出得结果
}
}
else//两个超大数位数不同
{
for(i=l-1; i>=f; i--)
{
x=x-1,y=y-1;
p=(a[x]-'0')+(b[y]-'0')+q;
c[j]=p%10;
q=p/10;//进位
j++;
}//先计算到位数少的位置
for(g=f-1; g>0; g--)
{
if(x>y)//看哪个数位数多
{
p=(a[g]-'0')+q;
c[j]=p%10;
q=p/10;
j++;
}
else
{
p=(b[g]-'0')+q;
c[j]=p%10;
q=p/10;
j++;
}
}//同理按手算法算到倒数第二位
// 再算最后一位,值直接存到下一个数组元素格
if(x>y) c[j]=(a[0]-'0')+q;
else c[j]=(b[0]-'0')+q;
for(k=j; k>=0; k--)
{
printf("%d",c[k]);
}//逆序输出得结果
}
printf("\n");
}
return 0;
}
`