题目描述
题目:https://vjudge.net/problem/HDU-1047#author=henuacm
废话挺多,其实就是数组模拟大数加法。但是需要注意的是:输出之间要空一行,而输出的最后一行不能有空行(这个坑了我好久。。)
思路分析
用一个int类型的数组存储每一位数。我这里打算写成一个结构体(写成类有点麻烦,不打熟练),尽量模块化。需要注意的是,我们需要反着存储,以方便计算。
例如:1234560在数组中应该是:0,6,5,4,3,2,1,这样能让小的位在数组的前面,方便计算的时候进位。
void input()
{
string t;
cin >> t;
for (int i=0;i<t.size();i++)
{
num[t.size()-1-i] = t[i] - '0';
}
p = t.size() > 1 ? t.size() : 1;
}
接下来是加法的设计,当然是从低位到高位逐个相加。每一位相加的结果用一个临时的t存起来,然后再把(对10)取余的结果放在本位,除了10之后的结果放在高位,一直到两个加数该位都为0位置。最后记得更新一下p(代表位数)。
friend bignum operator+(const bignum& a, const bignum& b)
{
bignum result(0);
//p表示位数。
for (int i = 0; i < a.p || i < b.p||result.num[i]!=0; i++)
{
int t = a.num[i] + b.num[i]+result.num[i];
result.num[i] = t % 10;
result.num[i + 1] = t / 10;
}
result.p = a.p > b.p ? a.p : b.p;
while (result.num[result.p] != 0) result.p++;
return result;
}
然后,因为输入是以0结束的,所以需要一个函数来判断输入的这个数是不是停止的数(0)。注意,只有单个0才是表示停止,例如000是不停止的。
bool judge()
{
if (num[p - 1] == 0&&p==1) return 0;
else return 1;
}
最后是输出,重载下<<运算符,从高位开始输出就是了,问题不大。
friend ostream& operator<<(ostream& os, bignum& a)
{
for (int i = a.p - 1; i >= 0; i--)
os << a.num[i];
return os;
}
大体就是这样
完整代码
#include <iostream>
#include <cstring>
#include <istream>
#include <string>
using namespace std;
struct bignum {
int num[105];
int p;
bignum(int n)
{
p = 1;
memset(num, 0, sizeof(num));
num[0] = n;
}
void input()
{
string t;
cin >> t;
for (int i=0;i<t.size();i++)
{
num[t.size()-1-i] = t[i] - '0';
}
p = t.size() > 1 ? t.size() : 1;
}
friend bignum operator+(const bignum& a, const bignum& b)
{
bignum result(0);
for (int i = 0; i < a.p || i < b.p||result.num[i]!=0; i++)
{
int t = a.num[i] + b.num[i]+result.num[i];
result.num[i] = t % 10;
result.num[i + 1] = t / 10;
}
result.p = a.p > b.p ? a.p : b.p;
while (result.num[result.p] != 0) result.p++;
return result;
}
friend ostream& operator<<(ostream& os, bignum& a)
{
int t=a.p-1;
while(a.num[t]==0&&t>0) t--;
for (int i = t; i >= 0; i--)
os << a.num[i];
return os;
}
bool judge()
{
if (num[p - 1] == 0&&p==1) return 0;
else return 1;
}
};
int main()
{
// freopen("out.txt", "w", stdout);
int t;
cin >> t;
while (t--)
{
bignum sum(0);
while (1)
{
bignum t(0);
t.input();
if (!t.judge()) break;
sum = sum + t;
}
cout << sum << endl;
if(t!=0) cout << endl;
}
return 0;
}