将一个大数除以 2

Posted

技术标签:

【中文标题】将一个大数除以 2【英文标题】:Dividing a large number by 2 【发布时间】:2015-01-03 16:12:18 【问题描述】:

假设我有以下列表的实现:

list=^listelement
listelement=record
    w:integer;
    next:list;
end;

而一个列表表示一个以十进制书写的大数 (列表 1 -> 2 -> 3 代表数字 123)。

我想做的是将这样的数字转换为二进制表示。因此,最简单的方法是将数字除以 2

问题是我很难实现除以 2 算法。我了解诸如此类的基本算法 https://www.mathsisfun.com/long_division.html,但我想不出办法将其转换为代码

我会很感激一些帮助

【问题讨论】:

根据您选择的二进制表示形式,在二进制中工作并计算 (1 * 10 + 2) * 10 + 3 可能更容易 【参考方案1】:

您将从左到右进行,将数字除以二。每次一个数字是奇数时,您都会将进位 (10) 传播到下一个数字。

示例:除法 123

1除以2为0,进位=10

2 + 10 除以 2 为 6,无进位

3除以2为1,进位=10

最后一个进位可以忽略。

结果:061

carry= 0;
element= head;
WHILE element <> NIL DO
  BEGIN
    element^.w= element^.w + carry;
    IF ODD(element^.w) THEN carry= 10 ELSE carry= 0;
    element^.w= element^.w DIV 2;
    element= element^.next
  END.

【讨论】:

以上是关于将一个大数除以 2的主要内容,如果未能解决你的问题,请参考以下文章

C++的大数除法最快速度的算法

滴滴笔试

# 国王游戏(贪心+大数乘除+微扰法证明)

long类型除以long类型的是四舍五入?

HDU 1023 Train Problem II 大数打表Catalan数

java大数--总结