题目
编写两个任意位数的大数相乘的程序,给出计算结果。
分析
1.数字无法用一个整形变量存储,所以需要利用字符串来表示一串数字。
2.根据乘法的运算规则,用一个乘数的每一位乘以另一个乘数,然后将中间结果按正确位置相加得到最终结果。
3.如果乘数为A和B,A的位数为m,B的位数为n,则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)。因此可以分配一个m+n的辅存来存储最终结果。
本题目采用移位进位法,其时间复杂度为O(N²),基本思路简述如下:
按照乘法的计算过程来模拟计算:
1 2
×3 6
——————————
71 2
36
————————
413 2
(其中,上标数字为进位数值。)
源码如下(c实现)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void muti(char *num_1, char*num_2)
{
int lennum_1, lennum_2;
int*s;
char*num;
lennum_1 = strlen(num_1);
lennum_2 = strlen(num_2);
s = (int*)malloc((lennum_1 + lennum_2) * sizeof(int));
num = (char*)malloc((lennum_1 + lennum_2+1) * sizeof(char));
int i, j;
for (i = 0; i < (lennum_1 + lennum_2); i++)
s[i] = 0;
for(i=0;i<lennum_1;i++)
for (j = 0; j < lennum_2; j++)
s[i + j + 1] = (num_1[i] - '0')*(num_2[j] - '0');
for (i = (lennum_1 + lennum_2 - 1); i >= 0; i--)
if (s[i] >= 10)
{
s[i - 1]+= s[i] / 10;
s[i] %= 10;
}
i = 0;
if (!s[0])
i++;
for (j = 0; j < (lennum_1 + lennum_2); i++, j++)
printf("%c",s[i] + '0');
}
希望您能留下一个赞(
^▽^)
更多内容请戳:我的个人博客