10:大整数加法
來源:http://noi.openjudge.cn/ch0106/10/
大整數(shù)加法
總時間限制:
1000ms
內(nèi)存限制:
65536kB
描述
求兩個不超過200位的非負(fù)整數(shù)的和。
輸入
有兩行,每行是一個不超過200位的非負(fù)整數(shù),可能有多余的前導(dǎo)0。
輸出
一行,即相加后的結(jié)果。結(jié)果里不能有多余的前導(dǎo)0,即如果結(jié)果是342,那么就不能輸出為0342。
樣例輸入
22222222222222222222 33333333333333333333樣例輸出
55555555555555555555分析:該題目雖然題目的字?jǐn)?shù)很少,但是要解決的問題,步驟比較多,對于新手,萌新來說,這道題可能就比較難了。
首先,我們看題,這是一個要求200位以內(nèi),兩個正整數(shù)之和,顯然用int類型的不可能把數(shù)據(jù)進(jìn)行輸入,所以我們可以將輸入的數(shù)據(jù)看做是字符串,利用字符串進(jìn)行輸入,在將字符串裝化為整數(shù)(例如:a[1]=str[1]-'0')。但是題目還有一個條件,?可能有多余的前導(dǎo)0,結(jié)果里不能有多余的前導(dǎo)0。所以我們要想辦法將前導(dǎo)零去掉。我們可以聲明一個i,在遍歷字符串,如果遇到為零的字符則i++,一直遍歷到不為零的字符在break,此時的i就為第一個不為零的位置。
代碼為:
string str;int a[204]; cin>>str; int i;int a_len=0; int n=str.size(); for(i=0;i<n;i++){//遍歷查找不為零的第一個位置。 if(str[i]!='0'){ break; } } for(;i<n;i++){//將字符化為整數(shù)。 a[a_len++]=str[i]-'0'; }按照以上代碼就可以將前導(dǎo)零去掉,并將字符化為整數(shù)存儲在數(shù)組里面。
接下來,就要做計算操作。首先計算時,先從最低位進(jìn)行計算。但是數(shù)組的第一位為最高位,所以我們要把整數(shù)?先進(jìn)行倒置,在進(jìn)行計算。這里有一個簡便的方法,c++中帶有的reverse件為(algorithm),該函數(shù)可以將數(shù)組進(jìn)行倒置。
?
?最后我們要解決進(jìn)位問題:可以設(shè)立一個數(shù)組x[204],將進(jìn)位進(jìn)行存儲利用。
以下為AC完整代碼:
#include<bits/stdc++.h> using namespace std; int main(){string str;string str1;int a[204]={0};int b[204]={0};int c[204]={0};int x[204]={0};cin>>str;cin>>str1;int i;int a_len=0;int b_len=0;int n=str.size();int m=str1.size(); //將字符轉(zhuǎn)化為數(shù)字,并將前導(dǎo)零去掉。for(i=0;i<n;i++){if(str[i]!='0'){break;}} for(;i<n;i++){a[a_len++]=str[i]-'0'; }for(i=0;i<m;i++){if(str1[i]!='0'){break;}} for(;i<m;i++){b[b_len++]=str1[i]-'0'; }reverse(a,a+a_len);//逆置。reverse(b,b+b_len);int num=max(a_len,b_len);if(a_len==0&&b_len==0){cout<<"0"<<endl;return 0;}for( i=0;i<num;i++){c[i]=a[i]+b[i]+x[i];if(c[i]>9){x[i+1]=1;c[i]-=10;}}if(x[i]==1){c[i]=1;num++;}for(int j=num-1;j>=0;j--){cout<<c[j];}cout<<endl;return 0; }?
?
?
?
總結(jié)
- 上一篇: FLYMCU串口下载配置界面
- 下一篇: 微软服务器异常是什么原因,远程服务器返回