大整數求和
阿新 • • 發佈:2018-04-04
整數位數 更多 std ret 技術分享 ace reverse img ima
大整數求和
摘要:對於一些大整數,如果超出電腦整型數所能表示的最大範圍,應該怎麽計算加法呢?我們可以利用字符串進行求和,具體代碼如下:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string Add(string &str1, string &str2); 5 int main() 6 { 7 string str1, str2; 8 cin >> str1 >> str2; 9 cout << Add(str1, str2) << endl;10 } 11 12 string Add(string & str1, string & str2) 13 { 14 int flag = 0; // 進位標記 15 int i = 0; // 位數 16 int n = str1.size(); 17 int m = str2.size(); 18 // 整數是從最低位開始相加,所以先將字符串反序 19 reverse(str1.begin(), str1.end()); 20 reverse(str2.begin(), str2.end()); 21 string res = "";// 存放結果的串 22 while (i < n && i < m) 23 { 24 res+=(((str1[i] - ‘0‘) + (str2[i] - ‘0‘) + flag) % 10 + ‘0‘);// 計算第i位的值 25 flag = ((str1[i] - ‘0‘) + (str2[i] - ‘0‘) + flag) / 10; // 計算第i位的進位 26 i++; 27 } 28 // 如果str1表示的整數位數更多,計算大整數str1余下的部分 29 while (i < n)30 { 31 res+= (((str1[i] - ‘0‘) + flag) % 10 + ‘0‘);// 計算第i位的值 32 flag = ((str1[i] - ‘0‘) + flag) / 10; // 計算第i位的進位 33 i++; 34 } 35 // 如果str2表示的整數位數更多,計算大整數str2余下的部分 36 while (i < m) 37 { 38 res+= (((str2[i] - ‘0‘) + flag) % 10 + ‘0‘);// 計算第i位的值 39 flag = ((str2[i] - ‘0‘) + flag) / 10; // 計算第i位的進位 40 i++; 41 } 42 // 最高位是否有進位,設置最高位的值 43 int d = (n > m) ? n : m; 44 if (flag == 1) 45 res+= ‘1‘; 46 // 反序結果串,結果即為所求 47 reverse(res.begin(), res.end()); 48 return res; 49 }
運行結果如下:
大整數求和