高精度乘法(如,long型乘以long型)

liefdiy 2009-04-16 07:57:34
看到过很多帖子讨论这个问题的,但是都没个汇总,
应该是要注意进位和数的存储两个问题吧,具体如何实现呢?希望能给出详细注释,不胜感激!
...全文
743 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanli19860412 2009-04-23
  • 打赏
  • 举报
回复
void multiply(int *na, int *nb, int *nc)
{
int i, j;

for (i = 0; i < N * 2; i++)
{
*(nc + i) = 0;
}

for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
*(nc + i + j) += *(na + i) * *(nb + j);
}
}

for (i = 0; i < N * 2 - 1; i++)
{
*(nc + i + 1) += *(nc + i) / 10;
*(nc + i) = *(nc + i) % 10;
}
}

就是这个。
alexhilton 2009-04-16
  • 打赏
  • 举报
回复
超过几千位的要用FFT去实现, 其他的模拟手工就可以了!
liefdiy 2009-04-16
  • 打赏
  • 举报
回复
我朋友写的一段:

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100

void getDigits(int *na, char *sz); //解析数字,放入字符串中
void multiply(int *na, int *nb, int *nc); // 将字符串中的数字相乘

int _tmain(int argc, _TCHAR* argv[])
{
char sz1[N], sz2[N];
int i,j,na[N],nb[N],nc[N*2];

printf("\n input number na:");
scanf("%s", sz1);

printf("\n input number nb:");
scanf("%s", sz2);

getDigits(na, sz1);
getDigits(nb, sz2);

multiply(na, nb, nc);

//找到最高位
j = N * 2 -1;
while (0 == nc[j])
{
--j;
}

//打印计算结果
printf("\n%s * %s = ", sz1, sz2);
for (i = j; i >= 0; i--)
{
printf("%d", nc[i]);
}

getchar();
getchar();
return 0;
}

// 把字符串形式的数字按位存放到数组
void getDigits(int *na, char *sz)
{
int i;
char digit;
int len = strlen(sz);
for (i = 0; i < N; i++)
{
*(na + i) = 0;
}
for (i = 0; i < len; i++)
{
digit = *(sz + i);
*(na + len - 1 - i) = digit - '0';
}
}

//把na*nb的结果存储到数组nc中,按位表示
void multiply(int *na, int *nb, int *nc)
{
int i, j;

// 先把结果数组设置为0
for (i = 0; i < N * 2; i++)
{
*(nc + i) = 0;
}

//竖式乘法
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
*(nc + i + j) += *(na + i) * *(nb + j);
}
}

// 处理进位
for (i = 0; i < N * 2 - 1; i++)
{
*(nc + i + 1) += *(nc + i) / 10; //进位累加到最高
*(nc + i) = *(nc + i) % 10; //该位的最后结果
}
}


大家再一起想想吧。
jackyjkchen 2009-04-16
  • 打赏
  • 举报
回复
简单的long * long可以用__int64存储,真正的高精度算法可不止这些,比如科学计算中那些几千位的大素数,都是用数组存的
bitsjx 2009-04-16
  • 打赏
  • 举报
回复
如果是高精度算法的话就不一样了!
计算机承受不了那么大的数据!
所以我认为还是想想高精度方面的算法比较好!
liefdiy 2009-04-16
  • 打赏
  • 举报
回复
有代码么。。?
asun112233 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Dinelgua 的回复:]
Ulong1 * Ulong2

首先判断 long1 是否大于 0xFFFFFFFF/long2
也就是看相乘后能否溢出

不能溢出则直接乘之
溢出则继续判断(long1 - 0xFFFFFFFF/long2) 是否大于0xFFFFFFFF/long2

如此循环下去 直到相乘不溢出 x * long2

最终结果为 循环次数*0xFFFFFFFF + x*long2;
[/Quote]正解
Dinelgua 2009-04-16
  • 打赏
  • 举报
回复
最终结果可考虑 与 long 数组 链表等存储
Dinelgua 2009-04-16
  • 打赏
  • 举报
回复
Ulong1 * Ulong2

首先判断 long1 是否大于 0xFFFFFFFF/long2
也就是看相乘后能否溢出

不能溢出则直接乘之
溢出则继续判断(long1 - 0xFFFFFFFF/long2) 是否大于0xFFFFFFFF/long2

如此循环下去 直到相乘不溢出 x * long2

最终结果为 循环次数*0xFFFFFFFF + x*long2;
liliangbao 2009-04-16
  • 打赏
  • 举报
回复
哈哈~
帮顶~
liefdiy 2009-04-16
  • 打赏
  • 举报
回复
额。。要考虑溢出的那种。。
  • 打赏
  • 举报
回复
..不溢出,直接乘,管那么多

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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