关闭

ACM-- Humble Numbers

198人阅读 评论(0) 收藏 举报
分类:
//   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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16742次
    • 积分:512
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类