这个事实上就是高精度加法的模板题。
所谓高精度加法,就是在数字过大的情况下,将数字看做是数组,数组中每个值只存一位。然后对两个数组进行加法计算。
也就是说,原本的加法是对两个数相加,而高精度加法是对两个数组相加。
原理呢,就是大家小学时候学的竖式运算,模拟那个过程来做就行了。
那么在这道题目中,模拟的过程就是:把位对齐(个位对个位,十位对十位,。。。),然后逐位相加,最后进位。
思路很简单,就是代码比较难码。
相信我,这题自己从头到尾写完的话你的码力会有很大的提升的。
这里的话习惯性会使用一个结构体来模拟一个大整数。不过由于你们还没开始学面向对象编程,这里就只使用结构体+函数来做这件事情:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
// 大整数结构体
struct BigInt
{
int A[405]; // 整数部分。A[0]为个位,A[1]为十位,以此类推
int B[405]; // 小数部分。B[i]为小数点后第i+1位。
// 初始化
void init()
{
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
}
// 将字符串转化为数字串,并划分开整数部分和小数部分
void Input(char *s,int len)
{
// 找小数点
int dpos=0;
while((dpos<len)&&(s[dpos]!='.'))dpos++;
// 还原整数部分
for(int i=1;dpos-i>=0;i++)
{
A[i-1]=s[dpos-i]-'0';
}
// 还原小数部分
for(int i=1;dpos+i<len;i++)
{
B[i-1]=s[dpos+i]-'0';
}
}
// 将另一个大整数结构体加进来
void Add(BigInt &p)
{
// 直接相加
for(int i=0;i<405;i++)
{
A[i]+=p.A[i];
B[i]+=p.B[i];
}
// 然后做进位修正
int d=0; // 用来存储进位
for(int i=404;i>=0;i--)
{
B[i]+=d;
d=B[i]/10;
B[i]%=10;
}
for(int i=0;i<405;i++)
{
A[i]+=d;
d=A[i]/10;
A[i]%=10;
}
}
// 输出大整数
void Print()
{
// 先找到最高位和最低位,把前缀零和后缀零砍掉
int ATop=404;
int BTop=404;
while((ATop>=0)&&(A[ATop]==0))ATop--;
while((BTop>=0)&&(B[BTop]==0))BTop--;
// 整数部分为0的时候需要输出0,这里需要对此进行修正
if(ATop==-1)ATop=0;
for(int i=ATop;i>=0;i--)
{
printf("%d",A[i]);
}
// 如果没有小数部分的话就不需要输出小数点了,所以要进行判定
if(BTop!=-1)
{
printf(".");
for(int i=0;i<=BTop;i++)
{
printf("%d",B[i]);
}
}
printf("\n");
}
};
char sa[405],sb[405];
int main()
{
BigInt a,b;
while(~scanf("%s%s",sa,sb))
{
a.init();
b.init();
a.Input(sa,strlen(sa));
b.Input(sb,strlen(sb));
a.Add(b);
a.Print();
}
return 0;
}
看完代码之后,自己试着靠自己写一遍吧。
网友评论