我有一些大数字(再次),我需要找到数字的总和是否为偶数。 我试过这个:用while循环找到数字的总和,然后检查那个总和%2是否等于0并且它正在工作但对于大数字来说它太慢了,因为我给出了数字间隔,如果输入是1999999 19999999999那么我的程序失败了,我无法在0,1秒的时限内完成。
怎么办?有没有其他更快的方法来做到这一点?
编辑:输入1999999 19999999999意味着它将从1999999开始并检查所有数字,如我上面写的直到19999999999,并且因为我们正在谈论大数字(< 2 ^ 30)我的程序是不值得的。
答案 0 :(得分:5)
您无需对数字求和。想一想。总和从零开始,通常被认为是偶数(尽管如果你愿意,你可以特殊情况)。
每个偶数都不会改变。如果总和是奇数,它就会保持奇数,如果它是偶数则保持均匀。
每个奇数位将总和从偶数变为奇数,或奇数变为偶数。
所以,只计算奇数位数。如果数字是偶数,那么所有数字的总和是偶数。如果数字是奇数,则所有数字的总和是奇数。
现在,您只需为您范围内的FIRST号码执行此操作。接下来你需要做的是弄清楚数字的均匀性或奇怪性如何随着你不断增加而变化。
我将此作为练习留给读者。家庭作业必须涉及一些工作!
答案 1 :(得分:2)
提示:如果您发现给定数字n
的数字之和为奇数,则数字n + 1
的数字之和是奇数还是偶数?
更新:正如@Mark指出的那样,它不是所以简单...但只有当n + 1
是10的倍数时才会出现异常,即(n + 1) % 10 == 0
。然后奇怪的是不会改变。然而,在这些情况中,当奇数确实改变时(例如199-> 200),每10次是例外。等等...基本上,根据n
的最高值9的位置,可以决定奇怪性是否在n
和n + 1
之间变化。我承认计算起来有点乏味,但我仍然相信它只是加起来所有这些数字...
答案 2 :(得分:1)
这是一个提示,它可能有效 - 如果结果是奇数或偶数,你不需要总结你只需要知道的数字 - 如果你假设你的总数是偶数,偶数无效,奇数切换(即奇数个奇数使其变为奇数)。
根据语言的不同,可能有更快的方式执行计算而不添加。
还记得 - 一个数字是奇数或甚至是基于它的最后一位二进制数字。
示例:
在ASM中,您可以对低位进行异或以获得正确的结果
在FORTH,这不会那么好......