给出最大1000位数的正数。你必须弄清楚这个数字是否可以被17整除。 我知道一种算法,它将最后一位数乘以5并从剩余数中减去,如果得到的数字可以被17整除,则该数字可以被17整除。 有没有更有效的方法?
答案 0 :(得分:11)
你可以做的是迭代数字,跟踪当前值 modulo 17.当你到达目的地时,如果当前值 modulo 17是零,那么它是17的倍数;否则,不是。
例如,如果您的号码是"12345"
(我假设您将此号码存储在十进制字符串中?),那么步骤为:
0
(0 * 10 + 1) mod 17
→1
(1 * 10 + 2) mod 17
→12
(12 * 10 + 3) mod 17
→4
(4 * 10 + 4) mod 17
→10
(10 * 10 + 5) mod 17
→3
因此12345 mod 17
为3
:12345
不能被17
整除。
(当然,使用12345
你可以先写12345 mod 17
,但是数字很多,上面的方法让我们一次只能处理一下,这很方便,因为它意味着我们所有的数字都足够小,以适应处理器的本机32位或64位整数。)
答案 1 :(得分:2)
另一种变体。 10 8 是-1 mod 17.
所以取前8个数字,转换成数字,然后转换为%17,得到余数mod 17.然后重复接下来的8个数字,除了你这次减去数字。然后添加接下来的8位数字等。
这样可以减少字符串 - >数字转换次数,减少mod 17操作次数。
答案 2 :(得分:0)
鉴于我们在这里谈论计算机程序,最多只需要1000次迭代的简单算法就可以了。