美文网首页
大数相加与相乘问题代码实现

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

作者: TingHW | 来源:发表于2017-11-18 22:26 被阅读0次

    题目是这样的:输入两个整数,要求输出这两个数的乘积或加和。输入的数字可能超过计算机内整形数据的存储范围。


    加和问题

    相对来说比较简单,大致思路是先将两个数字当做字符串读入,分别进行反转,为下一步的处理做准备。然后用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 }
    

    相关文章

      网友评论

          本文标题:大数相加与相乘问题代码实现

          本文链接:https://www.haomeiwen.com/subject/spuyvxtx.html