POJ1338 Ugly Numbers 丑数 [数论]
2012-01-31 15:02
337 查看
题意:
质因子只有2,3,5的树为丑数。求出从小到大的1500个丑数。
思路:
数论一般都是从数规律找起,从范例中可以看出。
2=2
3=3
4=2x2
5=5
6=2x3
8=2x2x2
9=3x3
...
很容易可以看出其实就是将2,3,5进行排列组合树1到1500之间的各个数(y=(2^a)*(3^b)*(5^c))。
从小到大存入一个数组。
但是在模拟这个递推过程的方法如代码:
感觉这种找规律的题目一定不要急于编程,要先弄清楚规律了多在纸上模拟模拟,否则很容易WA或者TLE。
质因子只有2,3,5的树为丑数。求出从小到大的1500个丑数。
思路:
数论一般都是从数规律找起,从范例中可以看出。
2=2
3=3
4=2x2
5=5
6=2x3
8=2x2x2
9=3x3
...
很容易可以看出其实就是将2,3,5进行排列组合树1到1500之间的各个数(y=(2^a)*(3^b)*(5^c))。
从小到大存入一个数组。
但是在模拟这个递推过程的方法如代码:
感觉这种找规律的题目一定不要急于编程,要先弄清楚规律了多在纸上模拟模拟,否则很容易WA或者TLE。
#include<iostream> #include<string> #include<algorithm> #define max(a,b) (a>b?a:b) #define abs(a) ((a)>0?(a):-(a)) #define min(a,b) (a<b?a:b) using namespace std; const int N=1500; int n,m; int ans[N+1]; int main() { int pos2=1,pos3=1,pos5=1; ans[1]=1; for(int i=2;i<=1500;i++) { int v2=ans[pos2]*2; int v3=ans[pos3]*3; int v5=ans[pos5]*5; ans[i]=min(min(v2,v3),v5); if(ans[i]==v2)pos2++;//注意这里如果用switch则错误,因为当v2==v3,则重复,所以pos2++且pos3++。 if(ans[i]==v3)pos3++; if(ans[i]==v5)pos5++; } int que; while(scanf("%d",&que),que) printf("%d\n",ans[que]); return 0; }
相关文章推荐
- POJ 1338 Ugly Numbers(数论)
- POJ 1338 Ugly Numbers 寻找丑数
- poj 1338 Ugly Numbers(丑数模拟)
- poj 1338 Ugly Numbers [ 离线预处理 - 只处理丑数,复杂度很低 此题也是 程序猿的经典面试题]
- POJ 1338 Ugly Numbers(丑数)
- POJ-1338-Ugly Numbers-丑数
- poj-1338-Ugly Numbers-数论
- POJ 1338 Ugly Numbers(我的水题之路——丑数2,3,5,质因子组成数)
- POJ 1338 Ugly Numbers(丑数)
- poj 1338 Ugly Numbers(丑数模拟)
- POJ 1338 Ugly Numbers
- poj 1338 丑数
- poj 1338 Ugly Numbers【终极打表】
- POJ 1338 Ugly Numbers
- poj 1338 Ugly Numbers(STL 之 pair)
- POJ1338 Ugly Numbers 堆优化+模拟
- Ugly Numbers--POJ 1338
- POJ - 1338 Ugly Numbers-STL的灵活运用
- POJ 1338 Ugly Numbers
- POJ 1338 Ugly Numbers