大数相加与相乘问题代码实现
2017-11-18 本文已影响0人
TingHW
题目是这样的:输入两个整数,要求输出这两个数的乘积或加和。输入的数字可能超过计算机内整形数据的存储范围。
加和问题
相对来说比较简单,大致思路是先将两个数字当做字符串读入,分别进行反转,为下一步的处理做准备。然后用0将字符串的位数补齐,分别两两相加并与进位数字求和,并记录是否有进位现象(进位记为1,反之记为0),将得出结果添加到输出字符串中,最后判断一下是否有溢出现象。java实现代码如下:
//相加方法具体实现
String addTwoBigNumber(String s1,String s2){
StringBuffer result=new StringBuffer();
String str1,str2;
//倒序两个字符串
str1=new StringBuffer(s1).reverse().toString();
str2=new StringBuffer(s2).reverse().toString();
boolean overflow =false;//最高位是否溢出
//对两个数的位数进行分类讨论
if(str1.length()<str2.length()){
//补齐位数
for(int i=str1.length();i<str2.length();i++){
str1+="0";
}
for(int i=0;i<str2.length();i++){
int carry=0;//进位标识
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{
//补齐位数
for(int i=str2.length();i<str1.length();i++){
str2+="0";
}
int carry=0;//进位标识
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();
}
相乘问题
思路和加和大同小异,以下是c++实现代码:
对数组逆序的函数
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 }
完成相乘的函数:
1 char* multiLargeNum(char* A, char* B)
2 {
3 int m = strlen(A);、、、、//使用时应包含string.h头文件
4 int n = strlen(B);
5 char* result = new char[m+n+1];
6 memset(result, '0', m+n);//对result的前m+n个元素初始化为0,使用时应包含string.h头文件
7 result[m+n] = '\0';
8 reverseOrder(A, 0, m-1);
9 reverseOrder(B, 0, n-1);
10
11 int multiFlag; // 乘积进位
12 int addFlag; // 加法进位
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); // 逆序回来
30
31 return result;
32 }