大数相加与相乘问题代码实现

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 }
上一篇下一篇

猜你喜欢

热点阅读