能帮我看看这段程序吗

language322 2007-05-27 08:19:24
最近在看一个大数的运算的程序,其中有个除法如下
void vlong_value::divide( vlong_value& x, vlong_value& y, vlong_value& rem )
{
init(0);
rem.copy(x);
vlong_value m,s;
m.copy(y);
s.init(1);
while ( rem.cf(m) > 0 )
{
m.shl();
s.shl();
}
while ( rem.cf(y) >= 0 )
{
while ( rem.cf(m) < 0 )
{
m.shr();
s.shr();
}
rem.subtract( m );
add( s );
}
}
其中int()是初始化 ,copy()是指大数的复制,shl()是指左移,shr()是指右移,cf()是比较大小,subtract()是减法,add是加法。
但其中哪个是被除数,哪个是除数啊,总是搞不明白,
哪位热心人帮我看看,理理思路,感激不尽!
...全文
261 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
language322 2007-05-27
  • 打赏
  • 举报
回复
都沉下去了 晕
shuangyp 2007-05-27
  • 打赏
  • 举报
回复
我是新手,看不动,帮你顶!
language322 2007-05-27
  • 打赏
  • 举报
回复
十分感谢各位热心的朋友,
理解了
尤其是Vitin(卫亭)
多谢了!
Vitin 2007-05-27
  • 打赏
  • 举报
回复
哦,最后一行还是每写对,应该是:
“此时 rem == x - (2^Sn + 2^Sn-1 + ... + 2^S0) * y == x - q*y == x % y”
呵呵,疏忽了,大家勿怪。可能还有其它笔误,请各位不吝指教。
Vitin 2007-05-27
  • 打赏
  • 举报
回复
刚在有一个笔误
1、倒数第三行:
“然后从s1开始,每次(即 while ( rem.cf(y) >= 0 ) 段)找到第一个Si==1,令s=2^i,并从rem(开始为x)中减去y*s,直到rem<y”
应该是
“然后从Sn开始自高向低,每次(即 while ( rem.cf(y) >= 0 ) 段)找到第一个Si==1,令s=2^i,并从rem(开始为x)中减去y*s,直到rem<y”
之前为便于表述修改了Si的表达,但这里忘改了

2、最后一行:
“此时 rem == x - (2^n + 2^n-1 + ... + 2^0) * y == x - q*y == x % y”
应该是
“此时 rem == x - (2^n + 2^(n-1) + ... + 2^0) * y == x - q*y == x % y”

Vitin 2007-05-27
  • 打赏
  • 举报
回复
void vlong_value::divide( vlong_value& x, vlong_value& y, vlong_value& rem )
// x:被除数,y:除数,rem:余数
{
init(0); //结合下面的add(s),这里应该是指设商(用q表示)q=0;
rem.copy(x); // rem = x;
vlong_value m,s;
m.copy(y); // m = y
s.init(1); // s = 1

// 目前的状态: assert(q==0 && rem == x && m==y && s==1);

while ( rem.cf(m) > 0 ) // rem > m,即现在x > m 时
{
m.shl(); // m *= 2
s.shl(); // s *= 2
}

// 目前的状态:assert(q==0 && rem==x && m== y*s && (s是2的整数幂) && x <=m
// &&(m是所有满足前面条件的所有数中最小的一个))
// 即上述while让m为y乘以一个2整数幂,以找到第一个不小于x的数,并用s保存这个乘数
// “m是所有满足前面条件的所有数中最小的一个”的数学表达是: y*s/2 <= x <= y*s

while ( rem.cf(y) >= 0 ) // rem >= y
{
while ( rem.cf(m) < 0 ) // rem < m
{
m.shr(); // m /= 2
s.shr(); // s /= 2
}

// 目前的状态 assert(rem>=y && m== y*s && (s是2的整数幂) && rem>=m
// && (m是满足上述条件中的所有数中最大的一个))
// 即while让m为y乘以一个2整数幂,以找到第一个不大于rem的数,并用s保存这个乘数
// “m是满足上述条件中的所有数中最大的一个”的数学表达是: y*s <= rem <= y*s*2
rem.subtract( m ); // rem -= m;即 rem -= y*s
add( s ); // 商q += s
}

// 目前的状态:assert( q==x/y && rem == x%y )

}

这个算法的本质是将商q 用二进制表示成 Sn Sn-1 .... S0
然后从s1开始,每次(即 while ( rem.cf(y) >= 0 ) 段)找到第一个Si==1,令s=2^i,并从rem(开始为x)中减去y*s,直到rem<y
此时 rem == x - (2^n + 2^n-1 + ... + 2^0) * y == x - q*y == x % y

language322 2007-05-27
  • 打赏
  • 举报
回复
我指得是俩个大数之间的除法,单单SHL或SHR怕是不行吧
myseven 2007-05-27
  • 打赏
  • 举报
回复
位移就是运算
VCLIFE 2007-05-27
  • 打赏
  • 举报
回复
帮顶
tangshuiling 2007-05-27
  • 打赏
  • 举报
回复
位移SHL或SHR就能表示除法和乘法的意思

64,664

社区成员

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

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