ACM-- Humble Numbers

来源:互联网 发布:在职软件工程硕士 编辑:程序博客网 时间:2024/06/08 19:02
//   Humberl Numbers;//  写出仅由2,3,5或7为因子的数。//   前20项如 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27 //   可知,前面的项在乘2,3,5或7后得到的数是符合的 //   从1开始计算,1分别与4个因子相乘,分别为2,3,5,7,其中最小的数2符合。 //   所以f(n)=min(f(i)*2,f(j)*3,f(m)*5,f(n)*7).    每取出一次最小的数,相应的变量+1.既移到下一个数。 //   若最小的数相等,变量同时+1//   Ps:11和1011 的英文表达都是11th,1011th  #include<iostream>#include<algorithm>#include<stdio.h>long long a[5900];using namespace std;int main(){a[1]=1;int i=1,j=1,m=1,n=1;for(int k=2;k<=5842;k++){int b[4];b[0]=a[i]*2;b[1]=a[j]*3;b[2]=a[m]*5;b[3]=a[n]*7;int min=b[0];for(int q=1;q<4;q++)  if(b[q]<min)    min=b[q];//cout<<i<<" "<<j<<" "<<m<<" "<<n<<" "<<endl;a[k]=min;    for(int q=0;q<4;q++)    {    if(b[q]==min)    {       switch(q)   {    case 0:i++;break;    case 1:j++;break;    case 2:m++;break;    case 3:n++;break;     }    }    }   //cout<<a[k]<<endl; }int Num;while(cin>>Num,Num){   int t=Num%10;if(Num%100==11||Num%100==12||Num%100==13)  t=4;char Out[1000];switch(t){case 1:sprintf(Out,"The %dst humble number is %lld.",Num,a[Num]);break;case 2:sprintf(Out,"The %dnd humble number is %lld.",Num,a[Num]);break;case 3:sprintf(Out,"The %drd humble number is %lld.",Num,a[Num]);break;default:sprintf(Out,"The %dth humble number is %lld.",Num,a[Num]);}cout<<Out<<endl;}return 0;}


0 0