POJ 1058---丑数

分类中将这题归结为DP,我觉得好像关系不是太大,不过这里有一个很节省空间的处理方法,本人觉得很妙,类似指针,节省了内存空间,

    原因在于,每次改变数组中的某个数时,前面的数都已经不会改变,可以记录其位置,直接利用,这里可能就是将这题归结为动态规划的原因吧,非常奇妙。

还有一点要注意的就是,开始WA了,原因在于输出的时候应该按照long long 型输出,我没有注意,导致了错误的结果。

#include<iostream>
#include<stdio.h>
using namespace std;
long long a[5850];
long long MinNum(long long a,long long b,long long c,long long d)
{
	long long m=min(a,b);
	long long n=min(c,d);
	m=min(m,n);
	return m;
}
int main()
{
	a[1]=1;
	int p2=1,p3=1,p5=1,p7=1;
	for(int i=2;i<=5842;i++)
	{
        a[i]=MinNum(2*a[p2],3*a[p3],5*a[p5],7*a[p7]);
		if(a[i]==2*a[p2]) p2++;          //这样处理可以避免出现重复的元素
		if(a[i]==3*a[p3]) p3++;
		if(a[i]==5*a[p5]) p5++;
		if(a[i]==7*a[p7]) p7++;
	}
	int n;
	//while((cin>>n)&&n)
	while((scanf("%d",&n)!=EOF) && n)
	{
        //if((n%10==1)&&(n%100!=11)) cout<<"The "<<n<<"st humble number is ";
		//else if((n%10==2)&&(n%100!=12)) cout<<"The "<<n<<"nd humble number is ";
		//else if((n%10==3)&&(n%100!=13)) cout<<"The "<<n<<"rd humble number is ";
		//else cout<<"The "<<n<<"th humble number is "<<a[n]<<endl;
		if(n % 10 == 1 && n % 100 != 11)  
              printf("The %dst humble number is %lld.\n",n ,a[n]);  
          else if(n % 10 == 2 && n % 100 != 12)  
              printf("The %dnd humble number is %lld.\n",n ,a[n]);  
          else if(n % 10 == 3 && n % 100 != 13)  
              printf("The %drd humble number is %lld.\n",n ,a[n]);  
          else  
              printf("The %dth humble number is %lld.\n",n ,a[n]);  
    }  
	return 0;
}

  

posted @ 2014-05-04 16:45  zhoudan  阅读(207)  评论(0)    收藏  举报