在编程竞赛中,以下模式出现在很多任务中:
给定数字A和B很大(可能是20个十进制数字或更多),确定具有特定属性P的A≤X≤B的整数X
SPOJ有许多这样的任务用于练习.
有趣的属性的例子包括:
我知道如果我们将f(Y)定义为这样的整数X≤Y,那么我们问题的答案就是f(B) - f(A - 1).减少的问题是如何有效地计算函数f.在某些情况下,我们可以利用某些数学属性来提出公式,但通常属性更复杂,我们在比赛中没有足够的时间.
在很多情况下是否有更通用的方法?它是否也可以用于枚举具有给定属性的数字或计算它们上的一些聚合?
其变体是找到具有给定属性的第k个数,当然可以通过使用二进制搜索和计数函数来求解.
我的目标是找到4到666554之间的所有数字的总和,仅包括4,5,6.
SUM = 4+5+6+44+45+46+54+55+56+64+65+66+.....................+666554.
Run Code Online (Sandbox Code Playgroud)
简单的方法是运行循环并仅添加由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*/
}
Run Code Online (Sandbox Code Playgroud)
但它似乎效率低下.检查数字是由4,5和6组成需要时间.有没有办法提高效率.我已经尝试了很多,但没有找到新的方法.请帮助.