• POJ2247 Humble Numbers


    #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[n] << '.' << endl;
            else if (n % 10 == 2 && n % 100 != 12)
                cout << "The " << n << "nd humble number is " << num[n] << '.' << endl;
            else if (n % 10 == 3 && n % 100 != 13)
                cout << "The " << n << "rd humble number is " << num[n] << '.' << endl;
            else
                cout << "The " << n << "th humble number is " << num[n] << '.' << 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[n]);
            else if( n%10 == 2 && n%100 !=12)
                printf("The %dnd humble number is %d.\n",n,ans[n]);
            else if( n%10 == 3 && n%100 !=13 )
                printf("The %drd humble number is %d.\n",n,ans[n]);
            else
                printf("The %dth humble number is %d.\n",n,ans[n]);
        }
        return 0;
    }

    一个humble数和{2,3,5,7}的积一定是一个humble,那么找出他们其中最小的作为新的humble。
    为了加快搜索过程,可以使用一个素数集大小的数组记录这个素数与某个humble的积<=当前最大的humble,这样可以过滤掉小的数,而且这个最大的humble和这个素数的乘积就有可能是最小的未生成的humble,比较每个素数能产生的最小的 humble,选一个最小的作为新的humble。

  • 相关阅读:
    Python列表及元组操作
    Python内建函数
    Python字符串相关
    检测浏览器是否安装FLASH插件
    瀑布流源码
    addEventListener 简析
    半角占一个字符,全角占两个字符
    替换class名
    正则表达式 验证是否全是空格
    图片旋转
  • 原文地址:https://www.cnblogs.com/dollarzhaole/p/3188903.html
Copyright © 2020-2023  润新知