您的位置:首页 > 其它

大数相乘问题

2018-01-19 16:01 302 查看

题目

编写两个任意位数的大数相乘的程序,给出计算结果。

分析

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] >=
4000
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');
}


希望您能留下一个赞(^▽^)

更多内容请戳:我的个人博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: