【OJ】1089: 丑数

【OJ】1089: 丑数_第1张图片

【OJ】1089: 丑数_第2张图片

详尽代码和说明如下:

#include
long long min(long long&a, long long &b,long long &c,long long&d)
{
    long long m = (a>b)?b:a;
    long long n = (c>d)?d:c;
    return (m>n)?n:m;
}

int main()
{
    long long * a = new long long[5843];
    a[0] = 1;
    // 由第一个丑数依次生成后面的丑数  (丑数只能由丑数产生)
    int t2 = 0; // 相当于一个指针
    int t3 = 0; 
    int t5 = 0;
    int t7 = 0;
    long long L2,L3,L5,L7;
    for(int i=1;i<5843;i++){
        L2 = a[t2]*2;
        L3 = a[t3]*3;
        L5 = a[t5]*5;
        L7 = a[t7]*7;
        a[i] = min(L2,L3,L5,L7);  // 由当前丑数生成的下一个丑数 下面的是关键代码
        while(a[t2]*2<=a[i]){
            t2++;
        }
        while(a[t3]*3<=a[i]){
            t3++;
        }
        while(a[t5]*5<=a[i]){
            t5++;
        }
        while(a[t7]*7<=a[i]){
            t7++;
        }
    }
    int n = 0;
    while(scanf("%d",&n)!=EOF){
        if(n==0)break;
        if(n%100>=11&&n%100<=13){ // 小心输出格式  这里我犯了错 所以指出来
            printf("The %dth humble number is %d.\n",n,a[n-1]);
            continue;
        }else if(n%10==1){
            printf("The %dst humble number is %d.\n",n,a[n-1]);
            continue;
        }else if(n%10==2){
            printf("The %dnd humble number is %d.\n",n,a[n-1]);
            continue;
        }else if(n%10==3){
            printf("The %drd humble number is %d.\n",n,a[n-1]);
            continue;
        }else{
            printf("The %dth humble number is %d.\n",n,a[n-1]);
        }
    }
    delete[] a;
    return 0;
}

应当说明一点的是,我发现那个最大的丑数并没有超过int类型的最大范围,所以可以将程序中的long long 类型换成int类型!

int的最大值是2147483647.

你可能感兴趣的:(数据结构与算法,C++)