详尽代码和说明如下:
#include<stdio.h>
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.