两个1024位的大数相乘,超出了int的承载能力,怎么办

zhangzwei1988 2009-04-23 09:02:36
我知道用数组解决,可想了半天也没有思路,到论坛上看看,也都是说大概方法。
有什么简单高效的解决方法没有,望大虾指点。
...全文
278 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangfei0554 2009-11-19
  • 打赏
  • 举报
回复
学习一下!
S_zxing 2009-04-23
  • 打赏
  • 举报
回复
这儿有几个函数,自己看看吧……

void add(int *a, int *b, int *c) {
int i, carry = 0;

for(i = N - 1; i >= 0; i--) {
c[i] = a[i] + b[i] + carry;
if(c[i] < 10000)
carry = 0;
else { // 进位
c[i] = c[i] - 10000;
carry = 1;
}
}
}

void sub(int *a, int *b, int *c) {
int i, borrow = 0;

for(i = N - 1; i >= 0; i--) {
c[i] = a[i] - b[i] - borrow;
if(c[i] >= 0)
borrow = 0;
else { // 借位
c[i] = c[i] + 10000;
borrow = 1;
}
}
}

void mul(int *a, int b, int *c) { // b 为乘數
int i, tmp, carry = 0;

for(i = N - 1; i >=0; i--) {
tmp = a[i] * b + carry;
c[i] = tmp % 10000;
carry = tmp / 10000;
}
}

void div(int *a, int b, int *c) { // b 为除數
int i, tmp, remain = 0;

for(i = 0; i < N; i++) {
tmp = a[i] + remain;
c[i] = tmp / b;
remain = (tmp % b) * 10000;
}
}
S_zxing 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jay_zhang 的回复:]
你这样:比如这两个数字为12344444和6789900008,但是计算机存储不了,可以把12344444分割为八个数字,放入一个int[]中,另外一个也放入另一个数组里,用第二个数组里面的所有的数字乘以另一个数组的数字,进位加到前一个数字上面,如此而已
[/Quote]
顶,这个是好像到的……
  • 打赏
  • 举报
回复
用 gmp大数库就可以了。
shinian1478 2009-04-23
  • 打赏
  • 举报
回复
在网上搜大数相乘就有了,好像用分治法可以
na2650945 2009-04-23
  • 打赏
  • 举报
回复
大数相乘。
pengjunhui01 2009-04-23
  • 打赏
  • 举报
回复
貌似数组存位数~~~~
jackyjkchen 2009-04-23
  • 打赏
  • 举报
回复
数组、分组等等各种方法都可以
liliangbao 2009-04-23
  • 打赏
  • 举报
回复
帮顶~
jay_zhang 2009-04-23
  • 打赏
  • 举报
回复
你这样:比如这两个数字为12344444和6789900008,但是计算机存储不了,可以把12344444分割为八个数字,放入一个int[]中,另外一个也放入另一个数组里,用第二个数组里面的所有的数字乘以另一个数组的数字,进位加到前一个数字上面,如此而已
pengzhixi 2009-04-23
  • 打赏
  • 举报
回复
搜索大数相乘

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧