• 两个大整数相乘 C++ 版本 源码


    看到了这个题目,就突然要写了,完全徒手写的, itoa_m 数字转换成字符串 是拷贝过来的,也是我积累的源码。

    这个大整数 主要思想就是按照我们小学学习的 乘法 笔算方法,先单个 乘积,再相加,具体不说了,你应该明白的。

    这个主要难点就是 字符串转数字 和数字转字符串 以及字符转相加。

    由于我是用了std::string 所以简单许多。如果改成C语言版本的,还要做许多工作。

    程序包括了我临时写的 两个大整数相加 的函数。

    可以通过 开始 运行 (Win+R) ,输入 calc 打开计算机 进行对比。不知道 有没有 Bug!

    这么一个小程序,好像 费了我一个多小时,关键 就是类库的积累,有类库会很方便的。如果用C 要更长时间,因为没太多可用的类库,如果用java,拥有庞大的类库,写这个程序应该简单的不得了了吧!!

    http://hero.pongo.cn/Question/Details?ID=6&ExamID=6

    /*
    
    
    
    
    两个大数相乘:char* multiply(char*,char*)。给了两个字符串,每个都是代表了一个很长的10进制表示的数, 比如 String str1 = "23456789009877666555544444"; String str2 = "346587436598437594375943875943875", 最后求出它们的乘积。 不用jdk的数学运算包BigInteger.或者类似的包。
    
    
    */
    
    
    #include<string>
    #include<iostream>
    #include<stdio.h>
    
    using namespace std;
    string strPlusAsNum(string str1,string str2);
    
    string ZeroNum(int num){
        string result="";
        for(int i=0;i<num;i++){
            result+="0";
        }
        return result;
    }
    char * itoa_m(int n){
        char* arrBuff=NULL;
        int radix=10;
        
        char tmp[33];
        char* tp = tmp;
        int i;
        unsigned v;
        int sign;
        char* sp;
        if (radix > 36 || radix <= 1)
        {
    //        __set_errno(EDOM);
            //return 0;
            radix=10;
        }
        sign = (radix == 10 && n < 0);
        if (sign)
            v = -n;
        else
            v = (unsigned)n;
        while (v || tp == tmp)
        {
            i = v % radix;
            v = v / radix;
            if (i < 10)
                *tp++ = i+'0';
            else
                *tp++ = i + 'a' - 10;
        }
        if (arrBuff == 0){
            arrBuff=(char*)malloc((tp-tmp)+sign+1);
        }
        sp = arrBuff;
        if (sign)
            *sp++ = '-';
        while (tp > tmp)
            *sp++ = *--tp;
        *sp = 0;
        return arrBuff;
    }
    
    int main(){
    
    //    string str1="2345678900987766554411223301",str2="346587436598437594375943875943875";
    string str1="1234",str2="1234";
        cout<<"============"<<endl;
        cout<<"Biginteger 相乘运算"<<endl;
        cout<<"============"<<endl;
        cout<<"输入Num1=";
        cin>>str1;
        cout<<"输入Num2=";
        cin>>str2;
        string result;
    
        int wei1=strlen(str1.data());
        int wei2=strlen(str2.data());
        string * calcOneBit=new string[wei2];
        for(int i=0;i<wei2;i++){
            calcOneBit[i]+=str2.data()[wei2-i-1];
            int n1=atoi(calcOneBit[i].data());
            
            calcOneBit[i]="";//清空
            int str1_jinwei=0;
            string temp;
            for(int j=0;j<wei1;j++){
                //进行一位与str1的计算结果 保存到calcOneBit[i]中
                temp=str1.data()[wei1-j-1];
                int n2=atoi(temp.data());
                int n=n1*n2;
                n+=str1_jinwei;
                if(n>=10){
                    str1_jinwei=n/10;
                    n=n%10;
                }else{
                    str1_jinwei=0;
                }
                temp=calcOneBit[i];
                char *ccc=itoa_m(n);
                calcOneBit[i]=ccc; free(ccc);
                calcOneBit[i]+=temp;
                cout<<"calcOneBit["<<i<<"]="<<calcOneBit[i].data()<<endl;
            }
            if(str1_jinwei>0){
                temp=calcOneBit[i];
                char * cc=itoa_m(str1_jinwei);
                calcOneBit[i]=cc;free(cc);
                calcOneBit[i]+=temp;
                cout<<"&& calcOneBit["<<i<<"]="<<calcOneBit[i].data()<<endl;
            }
        }
        for(int i=0;i<wei2;i++){
            if(i>0)
                calcOneBit[i]+=ZeroNum(i);
            cout<<" "<<i<<" "<< calcOneBit[i].data()<<endl;
        }
        
        result=calcOneBit[0];
        for(int i=0;i < wei1 - 1;i++){
            result=strPlusAsNum(result,calcOneBit[i+1]);
        }
        
        cout<<"========================"<<endl;
        cout<<""<<str1.data()<<" * "<<str2.data()<<" = "<<result.data()<<endl;
        cout<<"========================"<<endl;
        return 0;
    }
    
    string strPlusAsNum(string str1,string str2){
        int size1=strlen(str1.data());
        int size2=strlen(str2.data());
        
        int size=size1>size2 ? size1 : size2;
        int jinwei=0;
        string result="",temp="";
        for(int i=0;i<size;i++){
            int n1,n2,n;
            //n1
            if(i<size1){
                string temp2;temp2=str1.data()[size1-i-1];
                n1=atoi(temp2.data());
            }else{
                n1=0;
            }
            //n2
            if(i<size2){
                string temp2;temp2=str2.data()[size2-i-1];
                n2=atoi(temp2.data());
            }else{
                n2=0;
            }
            //Plus n
            n=n1+n2;n+=jinwei;
            if(n>=10){
                jinwei=n/10;
                n=n%10;
            }else{
                jinwei=0;
            }
            //n to string
            char * cc=itoa_m(n);
            temp=result;
            result=cc;free(cc);
            result+=temp;
        }
        if(jinwei>0){
            temp=result;
            char * cc=itoa_m(jinwei);
            result=cc;free(cc);
            result+=temp;
        }
        return result;
    }
  • 相关阅读:
    2014-写给明年现在的自己
    DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射
    DDD 领域驱动设计-在动手之前,先把你的脑袋清理干净
    醍醐灌顶:领域驱动设计实现之路
    拨乱反正:DDD 回归具体的业务场景,Domain Model 再再重新设计
    设计窘境:来自 Repository 的一丝线索,Domain Model 再重新设计
    No zuo no die:DDD 应对具体业务场景,Domain Model 重新设计
    拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?
    【记录】GitHub/TortoiseGit 修改邮箱/提交者
    死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2837682.html
Copyright © 2020-2023  润新知