大整数相乘
来源:互联网 发布:链轮厚度计算软件 编辑:程序博客网 时间:2024/06/05 21:57
输入的数据有两行,分别是两个非负数,最多1000位,输出它们的乘积
示例:
输入:
213897129837128937123
43502789523572345
输出:
9305121819000846375051201723846663435
转换成10000进制,即用一个int数组,每个数组代表一位数,按10000进制计算
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#define N 1010#define base 10000using namespace std;int a[500], b[500], ans[50002];char s1[1010], s2[1010];int main(){ int i, j, l1, l2, t, carry, mul; scanf("%s%s", s1, s2); l1 = strlen(s1); l2 = strlen(s2); for (j = 0, i = l1-1; i >= 3; i -= 4, j++){ t = s1[i]-'0'+10*(s1[i-1]-'0')+100*(s1[i-2]-'0')+1000*(s1[i-3]-'0'); a[j] = t; } if (i < 3){ t = 0; mul = 1; for (; i >= 0; i--){ t += (s1[i] - '0')*mul; mul *= 10; } a[j++] = t; }//字符串转换成int数组 l1 = j; for (j = 0, i = l2-1; i >= 3; i -= 4, j++){ t = s2[i]-'0'+10*(s2[i-1]-'0')+100*(s2[i-2]-'0')+1000*(s2[i-3]-'0'); b[j] = t; } if (i < 3){ t = 0; mul = 1; for (; i >= 0; i--){ t += (s2[i] - '0')*mul; mul *= 10; } b[j++] = t; } l2 = j; for (j = l1; j >= 0; j--){ if (a[j]) break; } memset(ans, 0, sizeof(ans)); carry = 0;//进位 for (i = 0; i < l1; i++){ carry = 0; for (j = 0; j < l2; j++){ ans[i+j] += a[i]*b[j]+carry; carry = ans[i+j]/base; ans[i+j] %= base; } ans[i+j] += carry; } for (j = 50000; j >= 0; j--){ if (ans[j]) break; } printf("%d", ans[j]); for (j--; j >= 0; j--){ printf("%04d", ans[j]);//输出的时候需要注意,不足四位的应该补0 } return 0;}
0 0
- 大整数相乘问题
- 大整数相乘算法
- 大整数相乘算法!
- 大整数相乘
- 大整数相乘算法
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘算法
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 两个大整数相乘
- 大整数相乘
- 关于使用Gson解析entity中遇到的问题
- Java已经开始影响这一代程序员
- codevs 2152 滑雪
- 学习C++不是一件容易的事情
- FFmpeg滤镜使用指南
- 大整数相乘
- 为ffmpeg添加自定义滤镜
- springmvc程序启动时候抛异常
- ffmpeg超详细综合教程二——为直播流添加滤镜
- Java虚拟机学习之走进 Java
- unix/linux 系统管理员的工作内容
- MySQL里用存储过程实现加减乘除
- 学习php的个人经验
- 在eclipse中如何查阅源代码