大数的加法
自己重新定义了一下加法,有点复杂
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int T, i, j, ia, ib,is;
char ch;
vector<char> *cSum;
vector<int> *iA, *iB;
cin >> T;
iA = new vector<int>[T];
iB = new vector<int>[T];
cSum = new vector<char>[T];
ch = getchar();
for (i = 0; i < T; i++)
{
while ((ch=getchar())!=' ')
{
ia = ch - '0';
iA[i].push_back(ia);
}
while ((ch = getchar()) !='\n')
{
ib = ch - '0';
iB[i].push_back(ib);
}
}
int h;
for (i = 0; i < T; i++)
{
int carry = 0;//进位
if (iA[i].size() >= iB[i].size())
{
for (j = iA[i].size(), h = iB[i].size(); h > 0; j--, h--)
{
is = iA[i][j - 1] + iB[i][h - 1] + carry;
if (is > 9)
{
carry = 1;
is -= 10;
ch = is + '0';
cSum[i].push_back(ch);
if (j == 1)
cSum[i].push_back('1');
}
else
{
carry = 0;
ch = is + '0';
cSum[i].push_back(ch);
}
}
for (j = iA[i].size() - iB[i].size() - 1; j >= 0; j--)
{
is = iA[i][j] +carry;
if (is > 9)
{
carry = 1;
if (j != 0)
is -= 10;
}
else
{
carry = 0;
}
ch = is + '0';
cSum[i].push_back(ch);
}
}
else
{
for (j = iB[i].size(), h = iA[i].size(); h > 0; j--, h--)
{
is = iB[i][j - 1] + iA[i][h - 1] + carry;
if (is > 9)
{
carry = 1;
is -= 10;
ch = is + '0';
cSum[i].push_back(ch);
if (j == 1)
cSum[i].push_back('1');
}
else
{
carry = 0;
ch = is + '0';
cSum[i].push_back(ch);
}
}
for (j = iB[i].size() - iA[i].size() - 1; j >= 0; j--)
{
is = iB[i][j] + carry;
if (is > 9)
{
carry = 1;
if (j != 0)
is -= 10;
}
else
{
carry = 0;
}
ch = is + '0';
cSum[i].push_back(ch);
}
}
}
for (i = 0; i < T; i++)
{
if (i != 0) cout << endl;
cout << "Case " << i+1 << ":\n";
for (j =0; j < iA[i].size(); j++)
{
cout << iA[i][j];
}
cout << " + ";
for (j = 0; j < iB[i].size(); j++)
{
cout << iB[i][j];
}
cout << " = ";
for (j = cSum[i].size() - 1; j >= 0; j--)
{
cout << cSum[i][j];
}
cout << endl;
}
return 0;
}
看看别人写的,真简洁
#include <stdafx.h>
#include<stdio.h>
#include<string.h>
void bigSum_1(void);
int main()
{
bigSum_1();
}
void bigSum_1(void)
{
char a[1000],b[1000],c[1001];
int i,j=1,p=0,n,n1,n2;//i是c的下标,j是case j,p是进位的标记,n是行数,n1n2是要加的数的最后一位的下标
scanf("%d",&n);
while(n)//n是行数,后面使用n--来重复输入
{
scanf("%s %s",a,b);
printf("Case %d:\n",j);
printf("%s + %s = ",a,b);
n1=strlen(a)-1;//strlen是真正存入的最后一位的数的下标,如输入12345那么strlen为5其下标是4
n2=strlen(b)-1;
for(i=0;n1>=0||n2>=0;i++,n1--,n2--)//i负责表示z的下标
{
if(n1>=0&&n2>=0){c[i]=a[n1]+b[n2]-'0'+p;}//当两者位数相同时
if(n1>=0&&n2<0){c[i]=a[n1]+p;}//位数不同
if(n1<0&&n2>=0){c[i]=b[n2]+p;}
p=0;
if(c[i]>'9'){c[i]=c[i]-10;p=1;}//进位
}
if(p==1){printf("%d",p);}//如果要进位,先输出1
while(i--)
{printf("%c",c[i]);}//倒序输出c即正着的和
j++;
if(n!=1){printf("\n\n");}//最后一个下面不要空行
else {printf("\n");}
n--;
}
}