您的位置:首页 > 其它

大数相乘

2014-06-14 18:09 288 查看
按照正常的计算规则,先用一个数组保存每两位相乘的结果,这里先不进位!等到两个数的所有的位数都计算完毕的时候,在遍历一遍结果数组,使得低位向高位进位!最后将结果进行翻转!

/*使用数组解决大数相乘的问题*/
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX 1000
using namespace std;

char * multyplus(char *s1,char *s2,int l1,int l2)
{
int k;
int i,j;
int array[MAX];
char *result = new char[MAX];//在调用函数中,使用new分配的内存,它的生存周期为整个函数,而不是局部的函数!
memset(array,-1,sizeof(array));
for(i=0;i<l1;i++)
{
k=i;
for(j=0;j<l2;j++)
{
if(array[k]==-1)
array[k++]=(s1[i]-48)*(s2[j]-48);//需要注意的是,字符和数字的区别
else
array[k++]+=(s1[i]-48)*(s2[j]-48);
}
}
//处理进位
for(k=0;;k++)
{
array[k+1]+=array[k]/10;
array[k]=array[k]%10;
if(array[k+1]==-1)
break;
}
//进行转换
for(i=k,j=0;i>=0;i--,j++)
{
result[j]=array[i]+48;
}

result[j]='\0';
return result;
}
int main()
{
char s1[20],s2[20],*res;
char temp;

cout << "~~~~~请输入两个数,中间以空格隔开~~~~~" <<endl;
scanf("%s",s1);
scanf("%s",s2);

//字符串翻转,使得以0开始的为最低位
int l1=strlen(s1);
int l2=strlen(s2);
for(int i=0;i<l1/2;i++)
{
temp=s1[i];
s1[i]=s1[l1-1-i];
s1[l1-1-i]=temp;
}
for(int i=0;i<l2/2;i++)
{
temp=s2[i];
s2[i]=s2[l2-1-i];
s2[l2-1-i]=temp;
}
cout<<s1<<' '<<s2<<endl;
if(l1>l2)
res=multyplus(s1,s2,l1,l2);
else
res=multyplus(s2,s1,l2,l1);

cout<<"使用大数运算进行运算得到的结果:";
cout<<res<<endl;
cout<<endl<<endl;
cout<<"用计算机直接运算的结果:";
int num1=atoi(s1);
int num2=atoi(s2);
cout<<num1*num2<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数相乘