您的位置:首页 > 编程语言 > C语言/C++

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

2012-12-28 17:49 387 查看
看到了这个题目,就突然要写了,完全徒手写的, 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: