实现思路:按照乘法规则,乘数和被乘数分别是,num1,num2。按照从后往前的顺序遍历num1,num2中的每一位上数字,首选取num2的最后一位分别于num1上的每一位相乘,将得到的结果保存在数组ret中,在之后的每一次遍历开始,使得ret都是从上一次开始位置减一出从新开始,并且执行对应位置上的自加操作。最后得到ret,从后往前遍历ret,遇见大于等于10的数字,将其商进位,余数保留。经过一次遍历得到最终乘数。并且考虑首位是否为零的情况。如果为零,则跳过输出,继续下面的输出,输出最终结果
#include<iostream>
#include <memory.h>
using namespace std;
#define N 14
//int *multi(int* num1, int size1, int* num2, int size2)
//{
//
int size = size1 + size2;
//
int* ret = new int[size];
//
memset(ret, 0, sizeof(int)*size);
//
//
for (int i = 0; i < size2; i++)
//
{
//
int k = i;
//
for (int j = 0; j < size1; j++)
//
{
//
ret[k++] += num1[j] * num2[i];
//
}
//
}
//
//
for (int i = 0; i < size; i++)
//
{
//
if (ret[i]>=10)
//
{
//
ret[i + 1] += ret[i] / 10;
//
ret[i] %= 10;
//
}
//
}
//
cout << endl;
//
return ret;
//
//}
int main(int argc, char** argv){
int num1[N] = { 9, 2, 3, 4, 5, 6, 7, 8, 9, 1, 1, 1, 1, 1 };
int num2[N] = { 9, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5 };
//int* ret = multi(num1, N, num2, N);
int ret[2 * N] = { 0 };
int n = 2 * N – 1;
for (int i = N-1; i >=0 ; i–)
{
int k = n–;
for (int j = N-1; j >=0 ; j–)
{
ret[k–] += num1[j] * num2[i];
}
}
for (int i = 2*N-1; i >=0 ; i–)
{
if (ret[i]>=10)
{
ret[i-1] += ret[i] / 10;
ret[i] %= 10;
}
}
for (int i = 0; i< N*2; i++)
{
if (i==0 && ret[i] == 0)
{
continue;
}
cout << ret[i];
}
return 0;
}