大数相乘问题
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'); }
希望您能留下一个赞(^▽^)
更多内容请戳:我的个人博客
相关文章推荐
- 算法理解之大数相乘问题
- 数学问题3:两个大数相乘
- ACM内部函数--数学问题--大数相乘
- 大数相乘的问题——大数阶乘(整数)
- 大数相乘问题---转载
- 算法题-大数相乘问题
- 大数问题:用字符串解决大数相加和相乘。【转】
- 算法理解——大数相乘问题
- poj2389 大数问题-大数相乘
- 多项大数相乘后果不可预知性的问题所在!
- 大数相乘问题
- C语言中的大数相乘问题
- 大数问题:用字符串解决大数相加和相乘
- 大数问题:用字符串解决大数相加和相乘
- 大数相乘的问题
- 阶乘问题(大数阶乘)简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 *【模板】 )
- 大数处理问题(二)(大数相乘)
- C语言大数相乘的问题
- 大数相乘问题--算法思想及Java实现解析(附详细注释)
- 关于大数相乘问题(Java实现)