題目是這樣的:輸入兩個(gè)整數(shù)扭勉,要求輸出這兩個(gè)數(shù)的乘積或加和痘括。輸入的數(shù)字可能超過(guò)計(jì)算機(jī)內(nèi)整形數(shù)據(jù)的存儲(chǔ)范圍姓蜂。
加和問(wèn)題
相對(duì)來(lái)說(shuō)比較簡(jiǎn)單萎羔,大致思路是先將兩個(gè)數(shù)字當(dāng)做字符串讀入液走,分別進(jìn)行反轉(zhuǎn),為下一步的處理做準(zhǔn)備贾陷。然后用0將字符串的位數(shù)補(bǔ)齊缘眶,分別兩兩相加并與進(jìn)位數(shù)字求和,并記錄是否有進(jìn)位現(xiàn)象(進(jìn)位記為1髓废,反之記為0)巷懈,將得出結(jié)果添加到輸出字符串中,最后判斷一下是否有溢出現(xiàn)象慌洪。java實(shí)現(xiàn)代碼如下:
//相加方法具體實(shí)現(xiàn)
String addTwoBigNumber(String s1,String s2){
StringBuffer result=new StringBuffer();
String str1,str2;
//倒序兩個(gè)字符串
str1=new StringBuffer(s1).reverse().toString();
str2=new StringBuffer(s2).reverse().toString();
boolean overflow =false;//最高位是否溢出
//對(duì)兩個(gè)數(shù)的位數(shù)進(jìn)行分類討論
if(str1.length()<str2.length()){
//補(bǔ)齊位數(shù)
for(int i=str1.length();i<str2.length();i++){
str1+="0";
}
for(int i=0;i<str2.length();i++){
int carry=0;//進(jìn)位標(biāo)識(shí)
int add=carry+Integer.parseInt(str1.charAt(i)+"")+Integer.parseInt(str2.charAt(i)+"");
if(add>=10){
carry=1;
add-=10;
if(i==str2.length()-1){
overflow=true;
}
}
result.append(add);
if(overflow){
result.append("1");
}
}
}else{
//補(bǔ)齊位數(shù)
for(int i=str2.length();i<str1.length();i++){
str2+="0";
}
int carry=0;//進(jìn)位標(biāo)識(shí)
for(int i=0;i<str1.length();i++){
int add=carry+Integer.parseInt(str1.charAt(i)+"")+Integer.parseInt(str2.charAt(i)+"");
carry=0;
if(add>=10){
carry=1;
add-=10;
if(i==str1.length()-1){
overflow=true;
}
}
result.append(add);
if(overflow){
result.append("1");
}
}
}
return result.reverse().toString();
}
相乘問(wèn)題
思路和加和大同小異顶燕,以下是c++實(shí)現(xiàn)代碼:
對(duì)數(shù)組逆序的函數(shù)
1 void reverseOrder(char* str, int p, int q)
2 {
3 char temp;
4 while(p < q)
5 {
6 temp = str[p];
7 str[p] = str[q];
8 str[q] = temp;
9 p ++;
10 q --;
11 }
12 }
完成相乘的函數(shù):
1 char* multiLargeNum(char* A, char* B)
2 {
3 int m = strlen(A);、蒋譬、割岛、、//使用時(shí)應(yīng)包含string.h頭文件
4 int n = strlen(B);
5 char* result = new char[m+n+1];
6 memset(result, '0', m+n);//對(duì)result的前m+n個(gè)元素初始化為0犯助,使用時(shí)應(yīng)包含string.h頭文件
7 result[m+n] = '\0';
8 reverseOrder(A, 0, m-1);
9 reverseOrder(B, 0, n-1);
10
11 int multiFlag; // 乘積進(jìn)位
12 int addFlag; // 加法進(jìn)位
13 for(int i=0; i <= n-1; i++) // B的每一位
14 {
15 multiFlag = 0;
16 addFlag = 0;
17 for(int j=0; j <= m-1; j++) // A的每一位
18 {
19 // '0' - 48 = 0
20 int temp1 = (A[j] - 48) * (B[i] - 48) + multiFlag;
21 multiFlag = temp1 / 10;
22 temp1 = temp1 % 10;
23 int temp2 = (result[i+j] - 48) + temp1 + addFlag;
24 addFlag = temp2 / 10;
25 result[i+j] = temp2 % 10 + 48;
26 }
27 result[i + m] += multiFlag + addFlag;
28 }
29 reverseOrder(result, 0, m+n-1); // 逆序回來(lái)
30
31 return result;
32 }