看到一道经典的面试题目—大整数相乘问题,完完整整敲了一遍,并且在牛客网运行了一遍,AC过了。
所采用的的方法是进位的方法。
举个例子:
用 789 × 956 ,通过计算我们很容易得到 754284 , 除了笔算或者口算的方法我们还可以用一种非常巧妙的方法来进行计算。
这个方法的过程是这样子的:
- 首先将 9 乘以 789 的每一位数字,得到: ( 81 ) ( 72 )( 63 )
- 然后将 5 乘以 789 的每一位数字,得到: ( 45 ) ( 40 ) ( 35 )
- 最后将 6 乘以 789 的每一位数字,得到:( 54 ) ( 48 ) ( 42 )
各项相加 得到 54 93 163 107 63
得到的数我们将其存放在一个数组里面,这个数组的名字是自定义的,我这里将其定义成ret
ret[0] = 54;
ret[1] = 93;
等等。
开始进行进位操作:
ret[1] —> 93 + 54/10 = 98;
ret[0] = 54%10 = 4;
163 = 163 + 98/10 = 172;
ret[1] = 98%10 = 8;
以此类推:
最后得到的结果为:
ret[5] = 7;
ret[4] = 5;
ret[3] = 4;
ret[2] = 2;
ret[1] = 8;
ret[0] = 4;
这就是我们得到的结果,这只是提供个思路,具体的代码如下:
#include <iostream>
#include <memory.h>
#define SIZE 11000
using namespace std;
//进行两个数相乘,完成以后返回字符串
string multi(int *num1,int size1,int *num2,int size2)
{
string s;
int ret[SIZE];
int i,j,k;
int size = size1+size2;
fill(ret,ret+SIZE,0);
//乘法
//将第二个数组中的一位上的数字分别与第一个数组的所有位相乘
//ret用于进位
for(i = 0;i<size2;i++)
{
k = i;
for(j = 0;j<size1;j++)
ret[k++] += num1[j] * num2[i];
}
//进位求余
for(i = 0;i<=size;i++)
{
ret[i+1] += ret[i]/10;
ret[i] %= 10;
}
if(ret[size])
s+=ret[size]+'0';
for(i=size-1;i>=0;i--)
s+=ret[i]+'0';
return s;
}
int main()
{
string number1,number2;
while(cin>>number1>>number2)
{
int i,j = 0;
int size1,size2;
int num1[SIZE],num2[SIZE];
//将定义的数组初始化为 0
fill(num1,num1+SIZE,0);
fill(num2,num2+SIZE,0);
size1 = number1.size();
size2 = number2.size();
for(i = size1-1;i>=0;i--)
num1[i] = number1[j++] - '0';
i = 0;
for(j = size2-1;j>=0;j--)
num2[j] = number2[i++] - '0';
string s = multi(num1,size1,num2,size2);
if(s[0]=='0')
{
for(i=1;i<=s.size();i++)
cout<<s[i];
cout<<endl;
}
if(s[0]!='0')
cout<<s<<endl;
}
}