杭電oj--1002(高精度加法)
阿新 • • 發佈:2018-11-23
思路分析:這是杭電上的一道典型的高精度加法運算,以現有的整型資料型別不足以計算如此大的數,不然會導致溢位。
此題的核心演算法是加法運算。
1.先將在螢幕上輸入的兩個數分別用字元陣列(字串)儲存起來
2.然後將這兩個數每一位進行對位,長度少的在高位補零,直至相等;為防止最高位有進位,在這兩個數的最高位之前再補一個零
3.之後就是將這兩個數按位相加,注意進位
4.如果最高位為零則清零
#include<iostream> #include<string> using namespace std; string clear(string a){//清零函式 if(a.empty()) a="0"; while(a[0]=='0') a.erase(0,1); if(a.empty()) a="0"; return a; } string add(string a,string b){//加法函式 int i=0,tmp,str=0; while(a.length()!=b.length()) a.length()<b.length() ? a='0'+a:b='0'+b; a='0'+a; b='0'+b;//對位 i=a.length(); while(i--){//逐位相加 tmp=a[i]-'0'+b[i]-'0'+str;//str用來代表tmp是否大於10,是則進位 str=tmp/10; a[i]=char(tmp%10+'0');用ascll碼轉成數字字元 } a=clear(a); return a; } void print(string s3,string s1,string s2,int i,int t){//格式輸出 cout<<"Case "<<i<<":"<<endl; if(i!=t) cout<<s1<<" + "<<s2<<" = "<<s3<<endl<<endl; else cout<<s1<<" + "<<s2<<" = "<<s3<<endl; } int main(){ string s1,s2,s3; int t,lab; while(cin>>t){ lab=t; for(int i=1;i<=t;i++){ cin>>s1>>s2; s3=add(s1,s2); print(s3,s1,s2,i,lab); } } return 0; }