在計算機中,由于處理器位寬限制,只能處理有限精度的十進制整數加減法,比如在32位寬處理器計算機中,參與運算的操作數和結果必須在-231~231-1之間。如果需要進行更大范圍的十進制整數加法,需要使用特殊的方式實現,比如使用字符串保存操作數和結果,采取逐位運算的方式。如下:9876543210 + 1234567890 = ?讓字符串 num1="9876543210",字符串 num2="1234567890",結果保存在字符串 result = "11111111100"。-9876543210 + (-1234567890) = ?讓字符串 num1="-9876543210",字符串 num2="-1234567890",結果保存在字符串 result = "-11111111100"。
要求編程實現上述高精度的十進制加法。要求實現方法: public String add (String num1, String num2)【輸入】num1:字符串形式操作數1,如果操作數為負,則num1的前綴為符號位'-'num2:字符串形式操作數2,如果操作數為負,則num2的前綴為符號位'-'【返回】保存加法計算結果字符串,如果結果為負,則字符串的前綴為'-'注:(1)當輸入為正數時,'+'不會出現在輸入字符串中;當輸入為負數時,'-'會出現在輸入字符串中,且一定在輸入字符串最左邊位置;(2)輸入字符串所有位均代表有效數字,即不存在由'0'開始的輸入字符串,比如"0012", "-0012"不會出現;(3)要求輸出字符串所有位均為有效數字,結果為正或0時'+'不出現在輸出字符串,結果為負時輸出字符串最左邊位置為'-'。
輸入兩個字符串
輸出描述:
輸出給求和后的結果
輸入例子:
98765432101234567890輸出例子:
11111111100這題就是個典型的大數運算問題。用C/C++來寫還是挺有意思的,用字符串處理可以避免大數據的溢出,如果嘗試用C/C++中最大數據long long來存仍然會溢出,因此還是老老實實實現:基本思路就是對字符串的每個字符模擬整數的從低位到高位按位相加,要注意進位的處理的和最高位'-'號的處理即可。
完整AC的代碼:
//應該是很簡潔的寫法了,思路就是對字符串的每個字符模擬按低位到高位的加法操作#include <iostream>#include <algorithm>using namespace std;string add(string numStr1,string numStr2){ string res; int c=0,temp; if(numStr1.size()!=numStr2.size()){//長度不同先補零 while(numStr1.size()<numStr2.size()){ numStr1.insert(0,1,'0'); } while(numStr1.size()>numStr2.size()){ numStr2.insert(0,1,'0'); } } if(numStr1[0]!='-'&&numStr2[0]!='-'){ for(int i=numStr1.size()-1;i>=0;i--){//按位相加,從低位開始 temp=(int)(numStr1[i]-'0')+(int)(numStr2[i]-'0')+c; if(temp>9){ temp=temp%10;//結果達到10則只保留個位 c=1;//然后進位給高位 } else c=0;//進位清0 res+=to_string(temp); } if(c)res+='1';//最高位還有進位,則補1個'1' reverse(res.begin(),res.end());//逆置字符串后結果就是相加后的值(res是從低位往里添加字符的) } else if(numStr1[0]=='-'&&numStr2[0]=='-'){//均為‘-’ for(int i=numStr1.size()-1;i>0;i--){//最高位不管 temp=(int)(numStr1[i]-'0')+(int)(numStr2[i]-'0')+c; if(temp>9){ temp=temp%10; c=1; } else c=0; res+=to_string(temp); } if(c)res+='1';//最高位 res+='-';//添加'-' reverse(res.begin(),res.end()); } return res;}int main(){ string numStr1,numStr2; while(cin>>numStr1>>numStr2){ cout<<add(numStr1,numStr2)<<endl; } return 0;} 另外,這題如果用java做,Java里有BigInteger的類,這個問題就不成問題了。。import java.math.BigInteger;import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner in=new Scanner(System.in); while(in.hasNext()){ String a=in.next(); String b=in.next(); BigInteger c=new BigInteger(a); BigInteger d=new BigInteger(b); System.out.PRintln(c.add(d)); } }} python更離譜:try: while 1: print input() + input()except: pass幾行代碼完美AC。。。怎么能這樣,C/C++ 黨已哭暈在廁所!!
新聞熱點
疑難解答