这个不算是原创,我是看的关于丑数的一个题,才会了这个题(算法竞赛这本书上有),答案是我在网上看的丑数的这道题的答案,才会了这道题,基本一样
标题:第几个幸运数
到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。
我们来看前10个幸运数字是:
3 5 7 9 15 21 25 27 35 45
因而第11个幸运数字是:49
小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
需要提交的是一个整数,请不要填写任何多余内容。
请把下面一段文字看完
每一个数都是,另外一个数 乘以3,5,7,得到的,这个类似于丑数,
但是怎么乘呢: 先把a[0] 赋值为1, j下标从1开始,这时候求a[1]的数,是下标 j 前面所有的数组元素,
- 依次乘以3,求出第一个大于a[0]的元素,
- 依次乘以5,求出第一个大于a[0]的元素,
- 依次乘以7,求出第一个大于a[0]的元素,
然后将这三个数比较大小,把最小的那个数赋值为 a[j]
结束条件: 当这个数等于 59084709587505 的时候就结束,最后输出 j 就是这道题的答案,
由于不是c++,java等,数组不能动态调节大小,所以我是已经知道答案的情况下,才把数组设置成 2000的
也可以依次测试,求出来数组是多少
————————————————————————————————————————————————————————
还有一种方法就是,挨个测试这个是,从 1 开始遍历到59084709587505;测试每个数是否为 幸运数
幸运数就是,只能被3,或者5,或者7整除的数,
- 如果这个数能整除3,就一直除
- 如果能乘除5,就一直除
- 如果能乘除7 就一直除
直到最后判断这个数是否等于1,如果等于就是幸运数,这个很费时间,我在电脑上跑了半个小时才跑到第九百多个
所以就不写那个了
这个其实是应该能判断从哪里开始乘以3,乘以5,乘以7,我能力有限,还不知道如何判断,这是一道填空题,答案对就行了
我知道一个题刚开始看的时候,可能看都看不懂,我刚开始看八皇后的时候,看了好几天都没看懂。
所以尽量能帮助就帮助,省点时间。
————————————————————————————————————————————————————————
#include<stdio.h>
long long int min(long long int a,long long int b,long long int c)//判断最小的数
{
int t;
if(a > b){
t = a;a = b;b = t;
}
if(a > c){
t = a;a = c;c = t;
}
if(b > c){
t = b;b = c;c = t;
}
return a;
}
int main()
{
long long int a[2000] = {1};
long long int i,j,k;
long long int L,M,N;
for(j = 1;; j++)
{
for(i = 0; i < j ;i++)//依次乘以3
{
if((a[i] * 3 > a[j-1]))
{
L = a[i] * 3;
break;
}
}
for(i = 0; i < j ;i++)//依次乘以5
{
if((a[i] * 5) > a[j-1])
{
M = a[i] * 5;
break;
}
}
for(i = 0; i < j ;i++)//依次乘以7
{
if((a[i] * 7) > a[j-1])
{
N = a[i] * 7;
break;
}
}
L = min(L,M,N);//最小
a[j] = L;//把最小赋值给a[j]
printf("第 %6lld个,,数值:%-16lld\n",j,L);//输出,便于观察
if(L == 59084709587505)//如果满足条件则退出
{
printf("\n总共%d\n",j);
break;
}
}
return 0;
}