多重精度-除法

yaos 2004-08-15 03:29:44
假设b为进制,u, v分别为左右操作数,w为结果

除法比较复杂,算法一点不比乘法少 :)

1、n 位 u 除 1 位 v

c = 0
i 从 n - 1 到 0 循环执行下面过程
t = c * b + u[i]
w[i] = t / v
c = t % v

输出 c 作为 u % v
...全文
136 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kerbcurb 2004-09-02
  • 打赏
  • 举报
回复
我写了一个除法的,速度较慢
const int LENGTH = 500;
const int BASE = 10;

int main()
{
int a[LENGTH] = {1,2,3,4,5,6,7,8,9};
int c[LENGTH] = {9,8,7,6,5,4,3,2,1};
int b[LENGTH] ;
for(int j = 0;j < LENGTH;j++)b[j] = 0;
int temp;
b[0] = c[0] / a[0];
for(int k = 0;k < LENGTH;k++)
{
temp = c[k];
for(int i = 0;i < k;i++)
temp -= a[k - i] * b[i];

b[k] = temp / a[0];
}
int s = 0;

for(int k = LENGTH - 1;k >0;k--)
{
s = b[k];
b[k] %= BASE;
b[k - 1] += s / BASE;
}

for(int k = LENGTH - 1;k >0;k--)
{
if(b[k] < 0)
{
s = b[k];
b[k] = (BASE + b[k] % BASE);
b[k - 1] += s / BASE - 1 ;
}
else
{
s = b[k];
b[k] %= BASE;
b[k - 1] += s / BASE;
}

}
cout<<endl;
for(int k = 0;k < LENGTH;k++)printf("%d",b[k]);

return 0;
}
无心人 2004-08-18
  • 打赏
  • 举报
回复
不许灌水
kerbcurb 2004-08-17
  • 打赏
  • 举报
回复
sorry,发错
kerbcurb 2004-08-17
  • 打赏
  • 举报
回复
你是自己用还是作业,如果是自己用可以下载下面的矩阵类

http://www.techsoftpl.com/matrix/index.htm

里面有例子
kerbcurb 2004-08-17
  • 打赏
  • 举报
回复
我介绍的方法,需要加上

using namespace math;

感谢姚先生这样的有心人,愿意把自己的心得以及自己编写的代码与大家共享
yaos 2004-08-15
  • 打赏
  • 举报
回复
2、n 位 u 除 m 位 v

为了保证每次的部分商都尽量准确
令 d = b / (v[m - 1] + 1)
u1 = u * d u1为 n + 1位
v1 = v * d v1为 m 位
既:保证v[m - 1] >= d / 2
如果 b 采用 2 进制 通过简单的移位就能保证v[m - 1] >= d / 2

然后

i 从 n 到 m 执行下面过程
t = u1[i] * b + u1[i - 1]
如果u1[i] = v1[m] 则 p = b – 1 否则 p = t / v1[m - 1]
如果 u1[i] * b ^ 2 + u1[i - 1] * b + u1[i - 2] > p * (v1[m - 1] + v1[m - 2])
p = p - 1
重复这个过程,直到判断条件不成立

u1[i]..u1[i – n] -= q * v1
如果出现借位,q = q – 1, u1[i]..u1[i – n] += v1

w[i - m] = q

嘿嘿,比较复杂
kerbcurb 2004-08-15
  • 打赏
  • 举报
回复
多为可以使用牛顿迭代法,另外因为数组乘法可以表示为矩阵相乘,因此除法就可以表示为矩阵相除,矩阵相除的做法可以避免一些麻烦,但是速度较慢。

数组乘法表示为矩阵相乘是这样的
数组a[n]乘数组b[n],用矩阵A、B分别对应a[n]和b[n]
|a[0] a[1] a[2]...a[n] |
| 0 a[0] a[1]...a[n-1]|
| 0 0 a[0]...a[n-2]|
A = | ......................|
|.......................|
|...................a[0]|
B类似

则矩阵乘积C = A * B的第一行,代表了乘积的各位(需要做进位处理)

除法,如果已知C和A求商B,则B = C / A(即C乘A的逆矩阵)
B的第一行代表了商(需要做进位/借位处理)

对于精度的处理,如果需要s位的精度,可以使A和C加长,比如10进制1234 / 5678,需要20位的精度,则变成1233.99999999999999999999 / 5677.99999999999999999999
小数点的位置需要用其他办法确定,数据存储以整形保存。

有一个矩阵模板可以从下面的链接下载
http://www.techsoftpl.com/matrix/index.htm
文件直接放进include文件夹,直接包含就可以使用了,但是VC6有点问题,好像是命名空间的问题,BCB、DEV-CPP可以直接使用,就像包含标准类库一样
cxjddd 2004-08-15
  • 打赏
  • 举报
回复
我晕!多位的呢?

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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