标签:
英文描述: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的结果,以便以后使用。最小的数一旦使用后,立即出队。
标签:
原文地址:http://www.cnblogs.com/WonderHow/p/4564065.html