HDOJ 1058:Humble Numbers 寻找丑数问题 解题报告

符合要求的丑数只含有2、3、5、7的质因子 求前5842个丑数

解题思想为:下一个最小的丑数一定在它前面的每个元素分别与2、3、5、7的乘积的结果中产生 而实际上只需跟踪4个数列即f[a]*2, f[b]*3, f[c]*5, f[d]*7 且为每个数列中满足条件的最小值 若f[a]*2被选中 则下轮应由f[a+1]*2代替为候选 不过由于不能保证四个序列没有相同的数值 如f[a]=3 f[b]=2时有f[a]*2==f[b]*3==6 故设bool m[4]为最小值的标记 于是在替换时根据标记替换对应元素

本题一开始没能AC 百度了其他人的程序才发现 只有if(n%10==1)就让后缀为st是不对滴 要if( n%10==1 && n%100!=11 )才行 这分明是在考英语啊 还是个平时基本不用的被扔在记忆角落的生僻知识 枉费六级裸考600分了

#include <iostream>
#include <string>
using namespace std;
int f[5843];
bool m[4];
int FourInLove(int p, int q, int s, int t){
	int mini;
	mini = min( min(p,q), min(s,t) );
	for(int i=0; i<4; i++ )
		m[i] = false;
	if ( mini == p ) m[0] = true;
	if ( mini == q ) m[1] = true;
	if ( mini == s ) m[2] = true;
	if ( mini == t ) m[3] = true;
	return mini;
}

void init(){
	int a, b, c, d;
	a = b = c = d = 1; 
	f[1] = 1;
	for(int i=2; i<=5842; i++ ){	//5842
		f[i] = FourInLove( f[a]*2, f[b]*3, f[c]*5, f[d]*7 );
		if ( m[0] )  a++;
		if ( m[1] )  b++;
		if ( m[2] )  c++;
		if ( m[3] )  d++;
		//cout << i << " " << index << " " << a << b << c << d << endl;
	}
}

int main()
{
	init();
	int n;
	string fix;
	//for(int i=2; i<=50; i++ )
	//	cout << "f[" << i<< "]= " << f[i] << endl;
	while( cin >> n && n!=0 ){
		if( n%10==1 && n%100!=11 )
			fix = "st";
		else if( n%10 == 2 && n%100 != 12 )
			fix = "nd";
		else if( n%10 == 3 && n%100 != 13 )
			fix = "rd";
		else fix = "th";
		cout << "The " << n << fix << " humble number is " << f[n] << "." << endl;
	}
	//system("pause");
    return 0;
}

你可能感兴趣的:(HDOJ 1058:Humble Numbers 寻找丑数问题 解题报告)