HDU 1753 大明A+B (大數加法)
阿新 • • 發佈:2019-02-13
#include <iostream> #include <string> using namespace std; int findpoint(string str) //找到小數點在字串中的位置 { int i; for(i=0; i<(int)str.length(); i++) { if(str[i]=='.') return i; } return i; } string IntegerAdd(string s1,string s2,int point1,int point2) //將整數部分相加,返回結果 { string a=s1.substr(0,point1); string b=s2.substr(0,point2); if(point1<point2) //確保a為較長的串 { string tempstr; int temp; tempstr=a; a=b; b=tempstr; temp=point1; point1=point2; point2=temp; } for(int i=(int)a.length()-1,j=(int)b.length()-1; j>=0; i--,j--)//將b的每一位與‘0’的差值加到a中 { a[i]+=b[j]-'0'; } for(int i=a.length()-1; i>=1; i--) //處理進位---加法是從右往左算的,進位也是 { if(a[i]>'9') { a[i-1]++; a[i]-=10; } } if(a[0]>'9') { a[0]-=10; a='1'+a; } return a; } string DecimalAdd(string &s1,string &s2,int point1,int point2) { //取小數點後的字串 string a; if(point1<(int)s1.length()-1) a=s1.substr(point1+1,s1.length()-1-point1); string b; if(point2<(int)s2.length()-1) b=s2.substr(point2+1,s2.length()-1-point2); //確保a為較長的串 if(s1.length()-point1<s2.length()-point2) { string tempstr; int temp; tempstr=a; a=b; b=tempstr; temp=point1; point1=point2; point2=temp; } /* 這裡要注意,string.length()是unsigned型別,與int型別的j計算時,如果j是負數,會轉化為比較大的無符號值, 所以要對它進行型別強轉 */ for(int i=0,j=0; j<=(int)b.length()-1; i++,j++) //從前往後,確保小數位對齊 { a[i]+=b[j]-'0'; } for(int i=a.length()-1; i>=1; i--) //從後往前逐一進位,除了第一個小數位 { if(a[i]>'9') { a[i-1]++; a[i]-=10; } } if(a[0]>'9') //判斷第一個小數位 { a[0]-=10; s1[point1-1]++; //原字串小數點前一位加1 } return a; } int main () { string s1,s2; int point1; int point2; string B; //小數位 string A; //整數位 while(cin>>s1>>s2) { point1=findpoint(s1); //找到小數點 point2=findpoint(s2); B=DecimalAdd(s1,s2,point1,point2); A=IntegerAdd(s1,s2,point1,point2); int i; for(i=B.length()-1; i>=0; i--) //從後向前,找到第一個不為0的字元 if(B[i]!='0') break; if(i<0) cout<<A<<endl; else { cout<<A<<'.'; for(int j=0;j<=i;j++) cout<<B[j]; cout<<endl; } } return 0; }