lcy最近在上数学课,老师给了他一个问题,让他求出第n个漂数。
漂数,是指它的素数因子只有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, ...
lcy想请聪明的你,写个程序帮帮他求出第n个漂数。
ball ball you!!
输入
多组样例,输入一个n(n≤5842),代表第n个漂数
输出
对每一组样例输出The nth humble number is number.。针对每一个n,正确的后缀有"st", "nd", "rd", "th"
#include <stdio.h>
int Min(int a, int b, int c, int d)
{
int min = a;
min = min < b ? min : b;
min = min < c ? min : c;
min = min < d ? min : d;
return min;
}
int main(void)
{
int p_number[5842];//漂数表
p_number[0] = 1;
int two_i = 0, three_i = 0, five_i = 0, seven_i = 0;
for (int i = 1; i < 5842; i++)
{
p_number[i] = Min(2 * p_number[two_i], 3 * p_number[three_i], 5 * p_number[five_i], 7 * p_number[seven_i]);
if (p_number[i] == 2 * p_number[two_i])
two_i++;
if (p_number[i] == 3 * p_number[three_i])
three_i++;
if (p_number[i] == 5 * p_number[five_i])
five_i++;
if (p_number[i] == 7 * p_number[seven_i])
seven_i++;
}//制作漂数表
int n = 0;//n表示第n个数
while (scanf("%d", &n) != EOF)
{
char ch_1 = 116, ch_2 = 104;//t的ASCII值为116,h的ASCII值为104
if (n % 100 < 10 || n % 100 > 19)
{
switch (n % 10)
{
case 1: ch_1 = 115; ch_2 = 116; break;//s的ASCII值为115
case 2: ch_1 = 110; ch_2 = 100; break;//n的ASCII值为110,d的ASCII值为100
case 3: ch_1 = 114; ch_2 = 100; break;//r的ASCII值为114
}
}
printf("The %d%c%c humble number is %d.\n", n, ch_1, ch_2, p_number[n - 1]);
}
return 0;
}
漂数数列中,每个漂数可以看出是前面某个漂数乘2/3/5/7
而且每个漂数只能产生4个新的漂数(即2/3/5/7倍的它本身)
同时注意11/12/13的英文后缀为th,而不是st/nd/rd(111,211,311也是如此)