51Nod 1005 大數加法

2021-08-14 04:28:23 字數 1434 閱讀 9693

給出2個大整數a,b,計算a+b的結果。

input

第1行:大數a

第2行:大數b

(a,b的長度 <= 10000 需注意:a b有可能為負數)

output

輸出a + b
input示例

68932147586

468711654886

output示例

537643802472

沒有一發tle,ac了,好開心~~

分析:思路還是很清晰的,就是**寫的有點長,可以改進,改進需要注意的點太多,遂放棄、、

分為兩種情況,s1,s2同號或者異號,兩種情況都要對s1,s2進行處理,進行移位操作,末位存在max_n-1位置,(去掉負號後的)首位存在v,方便計算。s1,s2同號時很好計算啦,異號時,交換s1,s2,使得s1總為正的,再對s1,s2相對絕對值的大小進行討論即可!

#include#include#include#includeusing namespace std;

const int max_n=11000;

bool f1=0,f2=0;//f1,f2分別記錄了s1,s2的正負

int len1,len2,v1=max_n,v2=max_n;//v1,v2記錄了s1,s2首位的位置(去掉負號後的)

char s1[max_n],s2[max_n];

void add()

for(int i=len2-1;i>=1;i--)

int v=min(v1,v2);

for(int i=max_n-1;i>=v;i--)

}if(s1[v-1]=='1')v--;//進製處理

printf("-");

for(int i=v;i=0;i--)

for(int i=len2-1;i>=0;i--)

int v=min(v1,v2);

for(int i=max_n-1;i>=v;i--)

}if(s1[v-1]=='1')v--;//進製處理

for(int i=v;i=len2)f=1;

else if(len1s2[i+1])

if(s1[i]=0;i--)

for(int i=len2-1;i>=1;i--)

int v=min(v1,v2);

for(int i=max_n-1;i>=v;i--)

}while(s1[v]=='0')v++;//退位處理

for(int i=v;i=0;i--)

for(int i=len2-1;i>=1;i--)

int v=min(v1,v2);

for(int i=max_n-1;i>=v;i--)

}while(s2[v]=='0')v++;//退位處理

printf("-");

for(int i=v;i

51Nod 1005 大數加法

今天遇見一道細節問題特別多的題,寫得我眼疼,題本身不難,難得是他的細節問題繁多,需要考慮的情況也甚多,稍有不慎就側漏了,哈哈。題的思路也很清晰,就是將最後的結果的正負的符號分離出來,剩下的就是高精度的加減法了,利用字串處理即可,效率可以很高很高,有多高呢?自己感覺吧!題 給出2個大整數a,b,計算a...

51nod 1005 大數加法

給出2個大整數a,b,計算a b的結果。input 第1行 大數a 第2行 大數b a,b的長度 10000 需注意 a b有可能為負數 output 輸出a binput示例 68932147586 468711654886output示例 537643802472純粹的模擬,主要分一下幾種情況 ...

51nod 1005 大數加法

1005 大數加法 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出2個大整數a,b,計算a b的結果。input 第1行 大數a 第2行 大數b a,b的長度 10000 需注意 a b有可能為負數 output 輸出a binput示例 68932147586 4...