我的目标是找到从4到666554的所有数字的总和,其中仅包括4,5,6。
SUM = 4+5+6+44+45+46+54+55+56+64+65+66+.....................+666554.
简单的方法是运行循环并添加仅由4,5和6组成的数字。
long long sum = 0; for(int i=4;i <=666554;i++){ /*check if number contains only 4,5 and 6. if condition is true then add the number to the sum*/ }
但这似乎效率很低。检查数字是否由4,5和6组成需要花费时间。有什么办法可以提高效率。我已经尝试了很多,但没有找到新方法。请帮忙。
对于1位数字,请注意
4 + 5 + 6 == 5 * 3
对于2位数字:
(44 + 45 + 46) + (54 + 55 + 56) + (64 + 65 + 66) == 45 * 3 + 55 * 3 + 65 * 3 == 55 * 9
等等。
在一般情况下,n-digits数字,有3 ň其中包括4,5,6只是,他们的平均价值是完全5...5(n位)。使用代码,它们的总和是('5' * n).to_i * 3 ** n(Ruby)或int('5' * n) * 3 ** n(Python)。
n
4
5
6
5...5
('5' * n).to_i * 3 ** n
int('5' * n) * 3 ** n
您计算高达6位数号码,然后减去的总和666555来666666。
666555
666666
PS:对于像这样的小数666554,使用模式匹配足够快。(示例)
666554