hud_1058   Humble Numbers

hud_1058   Humble Numbers

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058 

题目原文: 

 题意:

该题就是让我们找出题意里所谓的“Humble Numbers”,根据题目的意思,‘Humble Numbers’指的是一个数的所有质因子必须由2,3,5和7组成,非质因子无要求,例如14,它的因子为1,2,7,14,它的质因子为7,而7是在{2,3,5,7}这个集合里的,所以14是Humble Numbers,例如22,它的因子为1,2,11,22,它的质因数有2,11,然而11不在{2,3,5,7}这个集合里面,所以22不是Humble Numbers。题目的要求就是让我们找出第i个Humble Numbers。

解题思路:

根据题目意思,Humble Numbers的质因数自能是{2,3,5,7},所以Humble Numbers = 2^{a}*3^{b}*5^{c}*7^{d},根据这个推导式子打表即可得到最后的答案。(这里注意如果一个数没有质因子,那么它也是Humble Numbers)。

题目的注意点:

该题目需要注意的第一个注意点在解题思路上已经提及,第二个主意点的是它的输出格式,其中末尾由11,12,13这三个数组成的,就用-th,如果除末尾11,12,13之外,末尾由1组成,则用-st,末尾由2组成,则用-nd,末尾由3组成,则用-rd,除此之外,全部使用-th。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 6000;
int num[maxn];  //用于存取Humble number序列
int main()
{
	num[0] = 0, num[1] = 1;
	int l1,l2,l3,l4;
	l1 = l2 = l3 = l4 =1;
	for(int i = 2; i < maxn; i++){
		num[i] = min(min(num[l1]*2, num[l2]*3), min(num[l3]*5, num[l4]*7));
		if(num[i] == 2*num[l1]) l1++;
		if(num[i] == 3*num[l2]) l2++;
		if(num[i] == 5*num[l3]) l3++;
		if(num[i] == 7*num[l4]) l4++;
	}                                    //使用推导式打表得出Humble number数序列
	int n;
	while(cin>>n){
		if(n == 0){
			break;      // 是0就结束程序,跳出循环 
		}
		if(n % 100 == 11 or n % 100 == 12 or n % 100 == 13){
			printf("The %dth humble number is %d.\n", n, num[n]);
		}else if(n % 10 ==1){
			printf("The %dst humble number is %d.\n", n, num[n]);
		}else if(n % 10 ==2){
			printf("The %dnd humble number is %d.\n", n, num[n]);
		}else if(n % 10 ==3){
			printf("The %drd humble number is %d.\n", n, num[n]);
		}else{
			printf("The %dth humble number is %d.\n", n, num[n]);
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值