您的位置:首页 > 其它

大数相乘

2015-08-20 11:08 169 查看
大数相乘的实现,在这里,采用最直接的实现方法:类似于手工计算,逐位相乘。

#include <iostream>

using namespace std;

//反转字符,使其符合数组低位为数字低位
void reverseNum(char* s1)
{
int i=0;
int j=strlen(s1)-1;
while(i<j)
{
char temp=s1[i];
s1[i]=s1[j];
s1[j]=temp;
++i;
--j;
}
}

//输入两个数字字符串,进行相乘,并返回结果字符串
char* BigNumMultiple(char* s1,char* s2)
{
//反转数字
reverseNum(s1);
reverseNum(s2);

int temp1,temp2,addFlag,multiFlag;
int len1=strlen(s1);
int len2=strlen(s2);
temp1=temp2=0;

char* result=new char[len1+len2+1];
memset(result,48,len1+len2);
result[len1+len2]='\0';

//相乘
for(int i=0;i<=len1-1;i++)
{
multiFlag=0;
addFlag=0;
for(int j=0;j<=len2-1;j++)
{
temp1=(s1[i]-'0')*(s2[j]-'0')+multiFlag;
multiFlag=temp1/10;
temp1=temp1%10;
temp2=(result[i+j]-'0')+temp1+addFlag;
result[i+j]=temp2%10+'0';
addFlag=temp2/10;
}
result[i+len2]+=multiFlag+addFlag;
}

//去除高位多余的0
int n=strlen(result)-1;
while(result
=='0')
{
//确保结果为0的时候不会把最后一个0清空掉
if(n==0)
break;
result
='\0';
n--;
}

//恢复数字的字符串显示
reverseNum(s1);
reverseNum(s2);
reverseNum(result);

return result;
}

//简单测试
int main()
{
while(true)
{
char* left=new char[100];
char* right=new char[100];
char* str;
cin.getline(left,100);
cin.getline(right,100);
str=BigNumMultiple(left,right);
cout<<left<<"*"<<right<<"=\n"<<str<<endl;
system("pause");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: