检查一个数是否能被3整除[关闭]

2024-01-08

编写代码来确定一个数字是否能被 3 整除。该函数的输入是single位,0 或 1,如果到目前为止收到的数字是可被 3 整除的数字的二进制表示形式,则输出应为 1,否则为 0。

例子:

input  "0":       (0)  output 1
inputs "1,0,0":   (4)  output 0
inputs "1,1,0,0": (6)  output 1

这是基于一个面试问题。我要求绘制逻辑门,但由于这是 stackoverflow,我会接受任何编码语言。硬件实现(verilog 等)的奖励积分。

A 部分(简单):第一个输入是 MSB。

b部分(稍微难一点):第一个输入是 LSB。

c部分(困难):(a) 和 (b) 哪一个更快、更小? (理论上不是 Big-O 意义上的,但实际上更快/更小。)现在采用较慢/较大的那个,使其与更快/较小的那个一样快/小。


有一个相当著名的技巧,可以通过交替加减十进制数字来确定一个数字是否是 11 的倍数。如果最后得到的数字是 11 的倍数,那么一开始的数字也是 11 的倍数:



47278    4 - 7 + 2 - 7 + 8 = 0, multiple of 11     (47278 = 11 * 4298)
52214    5 - 2 + 2 - 1 + 4 = 8, not multiple of 11 (52214 = 11 * 4746 + 8)
  

我们可以将同样的技巧应用于二进制数。二进制数是 3 的倍数当且仅当其位的交替和也是 3 的倍数时:



4   = 100       1 - 0 + 0 = 1, not multiple of 3
6   = 110       1 - 1 + 0 = 0, multiple of 3
78  = 1001110   1 - 0 + 0 - 1 + 1 - 1 + 0 = 0, multiple of 3
109 = 1101101   1 - 1 + 0 - 1 + 1 - 0 + 1 = 1, not multiple of 3
  

无论从 MSB 还是 LSB 开始都没有区别,因此以下 Python 函数在这两种情况下都同样有效。它需要一个每次返回一位的迭代器。multiplier在 1 和 2 之间交替,而不是在 1 和 -1 之间交替,以避免取负数的模。

def divisibleBy3(iterator):

    multiplier = 1
    accumulator = 0

    for bit in iterator:
        accumulator = (accumulator + bit * multiplier) % 3
        multiplier = 3 - multiplier

    return accumulator == 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查一个数是否能被3整除[关闭] 的相关文章

  • Math.pow(65,17) % 3233 的令人惊讶的结果

    由于某种原因 在处理大数时 模运算符没有给出正确的输出 请查看代码 double x Math pow 65 17 3233 输出应该是2790但输出是887 0 我确信这很愚蠢 但我无法绕过它 提前致谢 的结果Math pow 65 17
  • 如何使用 T-SQL 将两个整数相除得到浮点结果?

    使用 T SQL 和 Microsoft SQL Server 当我在 2 个整数之间进行除法时 我想指定小数位数 例如 select 1 3 目前返回0 我希望它能回来0 33 就像是 select round 1 3 2 但这是行不通的
  • quotRem 和 divMod 之间的区别什么时候有用?

    来自哈斯克尔报告 quot rem div 和 mod 类 如果 y 是 方法满足这些定律 非零 x quot y y x rem y x x div y y x mod y x quot整数除法是否被截断 趋于零 而结果div被截断为负无
  • 在 C# 中,如何像 google calc 一样实现模数?

    我有一个代表形状的类 Shape 类有一个名为 Angle 的属性 我希望此属性的设置器自动将值包装到范围 0 359 中 不幸的是 一个简单的 Angle value 360 仅适用于正数 在 C 中 40 360 40 谷歌计算器可以做
  • 通过递归查找数组中最大的正整数

    我决定以递归方式实现一个非常简单的程序 看看 Java 处理递归 的效果如何 但结果有点短 这就是我最终写的 public class largestInIntArray public static void main String arg
  • 帮助尝试理解圆形数组中的模运算

    我有一个小问题试图弄清楚模运算是如何计算的 我正在建立一个队列 所以我有一个圆形数组 我无法弄清楚这个模运算是如何工作的 给定 q 一个 5 个元素长度的字符数组 MAX 常量给出数组的最大长度 5 rare 是一个 int 代表数组 q
  • 预期结果在 1 和 0 之间的除法总是给出 0 [重复]

    这个问题在这里已经有答案了 可能的重复 C 中整数除法的行为是什么 https stackoverflow com questions 3602827 what is the behavior of integer division in
  • 整数除以 3 最快的方法是什么?

    int x n 3 lt make this faster for instance int a n 3 lt normal integer multiplication int b n lt lt 1 n lt potentially f
  • 红宝石:能被4整除

    这工作正常 但我想让它更漂亮 并容纳所有能被 4 整除的值 if i 4 i 8 i 12 i 16 i 20 i 24 i 28 i 32 end 有什么聪明 简短的方法可以做到这一点吗 尝试这个 if i 4 0 这被称为 模运算符 h
  • C++ 获得整数除法和余数的最佳方法

    我只是想知道 如果我想将 a 除以 b 并且对结果 c 和余数都感兴趣 例如 假设我有秒数并想将其分成分钟和秒 那么最好的方法是什么去做吧 可不可能是 int c int a b int d a b or int c int a b int
  • 编译时(constexpr)浮点模?

    考虑以下函数 该函数在编译时根据参数类型计算积分或浮点模 template
  • 如何判断拼图是否完成?

    我正在准备一款像拼图这样的小游戏 为此我在布局中使用了 9 个图像视图和 9 个不同的图像 在启动时将图像设置为 imageview 这些是实际图像 随机播放后用户将滑动图像以完成拼图 我想检查修改后的图像与实际图像的 天气是否相等 如果它
  • Python 浮点除法不精确[重复]

    这个问题在这里已经有答案了 可能的重复 Python float str 浮动怪异 https stackoverflow com questions 1778368 python float str float weirdness Pyt
  • div() 库函数的用途是什么?

    当C有 两个数相除的运算符 其目的是什么div 库函数 http en cppreference com w c numeric math div 有没有什么场景 不能使用但是div can 来自 C99 基本原理文档 7 20 6 2 d
  • Google Sheet 产生无穷小数作为整数/整数的余数

    我有这个工作表 我需要在其中创建一个检查器来确定一个数字 两个数字之和除以另一个值 DIVISOR 的结果 是否是整数 没有小数 运行上述检查器后 它大部分工作得很好 但似乎检测到一些项目不是整数 尽管它们是除数的精确倍数 https do
  • 塔楼高度之间的最小差异?

    我正在做一些面试问题 我看到了这个 已知 n 座塔的高度和 k 值 您必须将每个塔的高度增加或减少 k 您需要最小化最长和最短塔的高度之间的差异并输出该差异 我想答案将是 maxheight k minheight k 我已经尝试过一些测试
  • 安全浮点除法

    我的代码中有一些地方我想确保 2 个任意浮点数 32 位单精度 的除法不会溢出 目标 编译器不保证 足够明确 对 INF INF 的良好处理 并且 不完全保证 IEEE 754 的异常值 可能未定义 并且目标可能会改变 另外 我无法对这几个
  • 具有非常大的数字的除法

    我只是想知道在处理大数字时有哪些不同的除法策略 我所说的大数字是指 50 位数字 例如 9237639100273856744937827364095876289200667937278 82637448262718273966299344
  • Java 模 2**64 求逆

    给定一个奇数long x 我在找long y这样他们的乘积模2 64 即 使用正常的溢出算术 等于 1 为了明确我的意思 这可以在几千年内计算出来 for long y 1 y 2 if x y 1 return y 我知道可以使用扩展欧几
  • 整数除法性质

    下面的整数算术性质成立吗 m n l m n l 起初我以为我知道答案 不成立 但现在不确定 它适用于所有数字还是仅适用于某些条件 即n gt l 该问题涉及计算机算术 即q n m q m n 忽略溢出 Case1 assume m kn

随机推荐