按照正常的计算规则,先用一个数组保存每两位相乘的结果,这里先不进位!等到两个数的所有的位数都计算完毕的时候,在遍历一遍结果数组,使得低位向高位进位!最后将结果进行翻转!
/*使用数组解决大数相乘的问题*/
#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;
}