页首Html代码

返回顶部

两个大整数相乘 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;
}

 

posted @ 2012-12-28 17:49  ayanmw  阅读(1102)  评论(0编辑  收藏  举报

页脚Html代码