這個(gè)事實(shí)上就是高精度加法的模板題。
所謂高精度加法睹酌,就是在數(shù)字過(guò)大的情況下权谁,將數(shù)字看做是數(shù)組,數(shù)組中每個(gè)值只存一位憋沿。然后對(duì)兩個(gè)數(shù)組進(jìn)行加法計(jì)算旺芽。
也就是說(shuō),原本的加法是對(duì)兩個(gè)數(shù)相加辐啄,而高精度加法是對(duì)兩個(gè)數(shù)組相加采章。
原理呢,就是大家小學(xué)時(shí)候?qū)W的豎式運(yùn)算则披,模擬那個(gè)過(guò)程來(lái)做就行了共缕。
那么在這道題目中,模擬的過(guò)程就是:把位對(duì)齊(個(gè)位對(duì)個(gè)位士复,十位對(duì)十位图谷,翩活。。便贵。)菠镇,然后逐位相加,最后進(jìn)位承璃。
思路很簡(jiǎn)單利耍,就是代碼比較難碼。
相信我盔粹,這題自己從頭到尾寫完的話你的碼力會(huì)有很大的提升的隘梨。
這里的話習(xí)慣性會(huì)使用一個(gè)結(jié)構(gòu)體來(lái)模擬一個(gè)大整數(shù)。不過(guò)由于你們還沒(méi)開(kāi)始學(xué)面向?qū)ο缶幊滔衔耍@里就只使用結(jié)構(gòu)體+函數(shù)來(lái)做這件事情:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
// 大整數(shù)結(jié)構(gòu)體
struct BigInt
{
int A[405]; // 整數(shù)部分轴猎。A[0]為個(gè)位,A[1]為十位进萄,以此類推
int B[405]; // 小數(shù)部分捻脖。B[i]為小數(shù)點(diǎn)后第i+1位。
// 初始化
void init()
{
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
}
// 將字符串轉(zhuǎn)化為數(shù)字串中鼠,并劃分開(kāi)整數(shù)部分和小數(shù)部分
void Input(char *s,int len)
{
// 找小數(shù)點(diǎn)
int dpos=0;
while((dpos<len)&&(s[dpos]!='.'))dpos++;
// 還原整數(shù)部分
for(int i=1;dpos-i>=0;i++)
{
A[i-1]=s[dpos-i]-'0';
}
// 還原小數(shù)部分
for(int i=1;dpos+i<len;i++)
{
B[i-1]=s[dpos+i]-'0';
}
}
// 將另一個(gè)大整數(shù)結(jié)構(gòu)體加進(jìn)來(lái)
void Add(BigInt &p)
{
// 直接相加
for(int i=0;i<405;i++)
{
A[i]+=p.A[i];
B[i]+=p.B[i];
}
// 然后做進(jìn)位修正
int d=0; // 用來(lái)存儲(chǔ)進(jìn)位
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;
}
}
// 輸出大整數(shù)
void Print()
{
// 先找到最高位和最低位可婶,把前綴零和后綴零砍掉
int ATop=404;
int BTop=404;
while((ATop>=0)&&(A[ATop]==0))ATop--;
while((BTop>=0)&&(B[BTop]==0))BTop--;
// 整數(shù)部分為0的時(shí)候需要輸出0,這里需要對(duì)此進(jìn)行修正
if(ATop==-1)ATop=0;
for(int i=ATop;i>=0;i--)
{
printf("%d",A[i]);
}
// 如果沒(méi)有小數(shù)部分的話就不需要輸出小數(shù)點(diǎn)了援雇,所以要進(jìn)行判定
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;
}
看完代碼之后矛渴,自己試著靠自己寫一遍吧。