POJ2247 Humble Numbers
2012-07-08 14:00
267 查看
#include <iostream> #include <fstream> #include <string> #include <algorithm> #include <cstring> #include <stack> #include <queue> using namespace std; int num[5845]; void f() { int i, j, k, l, temp; i = j = k = l = 2; memset(num, 0, sizeof(num)); num[0] = num[1] = 1; int num1, num2, num3, num4; for (int m = 2; m <= 5842; m++) { num1 = num[i-1] * 2; num2 = num[j-1] * 3; num3 = num[k-1] * 5; num4 = num[l-1] * 7; temp = min(min(num1, num2), min(num3, num4)); num[m] = temp; if (temp == num1) i++; if (temp == num2) j++; if (temp == num3) k++; if (temp == num4) l++; } } int main() { int n; f(); while (cin >> n) { if (n == 0) break; if (n % 10 == 1 && n % 100 != 11) cout << "The " << n << "st humble number is " << num << '.' << endl; else if (n % 10 == 2 && n % 100 != 12) cout << "The " << n << "nd humble number is " << num << '.' << endl; else if (n % 10 == 3 && n % 100 != 13) cout << "The " << n << "rd humble number is " << num << '.' << endl; else cout << "The " << n << "th humble number is " << num << '.' << endl; } return 0; }附上看不懂的一个
//Problem: 2247 User: himdd //Memory: 188K Time: 16MS //Language: C++ Result: Accepted //Source Code #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int ans[6000]={1,1}; int prime[4]={2,3,5,7}; int a[4]; void getans() { for(int c=2;c<=5842;c++) { for(int i=0;i<4;i++) { while(prime[i]*ans[a[i]]<=ans[c-1])a[i]++; } int min=2000000001; for(int i=0;i<4;i++) { if(prime[i]*ans[a[i]]<min) min = prime[i]*ans[a[i]]; } ans[c]=min; } } int main() { int n; getans(); while(scanf("%d",&n),n) { if(n%10==1 && n%100 !=11) printf("The %dst humble number is %d.\n",n,ans ); else if( n%10 == 2 && n%100 !=12) printf("The %dnd humble number is %d.\n",n,ans ); else if( n%10 == 3 && n%100 !=13 ) printf("The %drd humble number is %d.\n",n,ans ); else printf("The %dth humble number is %d.\n",n,ans ); } return 0; }
一个humble数和{2,3,5,7}的积一定是一个humble,那么找出他们其中最小的作为新的humble。
为了加快搜索过程,可以使用一个素数集大小的数组记录这个素数与某个humble的积<=当前最大的humble,这样可以过滤掉小的数,而且这个最大的humble和这个素数的乘积就有可能是最小的未生成的humble,比较每个素数能产生的最小的 humble,选一个最小的作为新的humble。
相关文章推荐
- POJ2247 Humble Numbers
- [poj2247] Humble Numbers (DP水题)
- poj2247(hud1058)--Humble Numbers (模拟)
- POJ2247,hdu1058(Humble Numbers)
- HDU-1058 Humble Numbers(线性dp 枚举因子个数)
- hdu 1058 Humble Numbers
- hdu 1058 Humble Numbers
- HDU 1058 Humble Numbers
- hdu1058 Humble Numbers (动态规划)
- USACO Humble Numbers
- hdu 1058 Humble Numbers (动态规划)
- HDU_1492 The number of divisors(约数) about Humble Numbers
- poj 2247 Humble Numbers
- HDU_1058 Humble Numbers(DP)
- zoj1095 Humble Numbers
- hdu1058 Humble Numbers 解题报告
- HDU 1492 The number of divisors(约数) about Humble Numbers
- hdu 1058 Humble Numbers
- hdu 1058 humble numbers
- HDU 1492 The number of divisors(约数) about Humble Numbers