大整数乘法-数组实现

实现思路:按照乘法规则,乘数和被乘数分别是,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;

}

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/liuzhuannianshao/article/details/70675959
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞