Wonder奇迹奇迹

导航

计算第k个质因数只能为3,5,7的数

英文描述:Design an algorithm to find the kth number such that the only prime factors are 3, 5, and 7


思路:质因数只能为3,5,7,设这个数为val,则val = (3^i)(5^j)(7^n) (i,j,n>=0),显然第1个数为1,第2个为1*3,第3个为1*5,第4个为1*7,第5个为3*3,第6个为3*5,第7个为3*7...

如果将钱k-1个数组成一个链表r,可以看出,第k个数为3或5或7乘以前k-1个数中的某一个,得到一个还未加入r的最小的数。为了防止过多的循环,我们应对这个最小的数保持记录。

代码:

 1 #include<queue>
 2 
 3 int findnum(int k)
 4 {
 5     if (k <= 0)
 6         return 0;
 7     int val =1;
 8     queue<int> Q3; Q3.push(3);
 9     queue<int> Q5; Q5.push(5);
10     queue<int> Q7; Q7.push(7);
11 
12     for (k--; k > 0; k--)
13     {
14         val = findmin(Q3.front(), Q5.front(), Q7.front());
15         if (val == Q7.front())
16             Q7.pop();
17         else
18         {
19             if (val == Q5.front())
20                 Q5.pop();
21             else
22             {
23                 Q3.pop();
24                 Q3.push(val * 3);
25             }
26             Q5.push(val * 5);
27         }
28         Q7.push(val*7);
29     }
30 
31     return val;
32 }
33 int findmin(int a, int b, int c)
34 {
35     int result = 0;
36     if (a < b)
37         result = a;
38     else result = b;
39     if (result > c)
40         result = c;
41     return result;
42 }

我使用了C++ STL模板queue(队列,先入先出),Q3,Q5,Q7分别用来记录上一次最小的数乘以3,5,7的结果,以便以后使用。最小的数一旦使用后,立即出队。

posted on 2015-06-09 17:16  Wonder奇迹奇迹  阅读(343)  评论(0编辑  收藏  举报