【发布时间】:2019-09-17 15:34:32
【问题描述】:
“丑数是只有质因数为 2、3 或 5 的数。 序列 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... 显示前 11 个丑陋的 数字。按照惯例,包括 1。”
给定数字 X,确定 X 在该序列中的顺序。 示例:X = 12,输出:10。
我做了一个蛮力算法,在 O(XlogX) 中运行:
long long cnt = 0;
for(long long i = 1; i<X; i++)
{
long long tmp = i;
while(tmp % 2 == 0) tmp/=2;
while(tmp % 3 == 0) tmp/=3;
while(tmp % 5 == 0) tmp/=5;
if(tmp == 1) cnt ++;
}
cout << cnt+1 << endl;
但是,X 可能是 1e18,可能有 10^5 个查询,每个查询都会给我们一个数字 X。
有人知道执行此操作的更有效算法吗?谢谢。
【问题讨论】:
-
此类问题通常需要您了解、研究或发现一个偷偷摸摸的数学技巧,从而大大减少您需要执行的计算量。
-
谢谢。我已经在 O(11000) 中生成了前 11000 个丑陋的数字并且它起作用了。第 11000 个丑数 > 1e18。
标签: c++ algorithm math optimization numbers