到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。
我们来看前10个幸运数字是:
3 5 7 9 15 21 25 27 35 45
因而第11个幸运数字是:49
小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
解题思路:
因为Java不支持数组元素的动态添加与删除,所以我这里使用集合来保存元素。我的解法比较规规矩矩,可能显得比较笨拙,但是是最容易理解的。我先往集合里加入3,5,7三个元素,然后对这几个元素分别乘以3,5,7,只要比7大便结束循环,然后把最小的数再加入到集合中,再重复以上操作,直到出现 59084709587505 。需要注意一点,这里数值比较大,我采用的是long类型。
代码示例:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
long n = 59084709587505l;
// 用集合来保存数据
List<Long> list = new ArrayList();
list.add((long) 3);
list.add((long) 5);
list.add((long) 7);
for (int i = 4; i < 2000; i++) {
long min = 0;
long n1 = 0;
long n2 = 0;
long n3 = 0;
// 集合里最后一个元素
Long last = list.get(list.size() - 1);
// 对集合里的数据进行遍历,分别乘以3,5,7,只要比最后一个元素大就结束循环
// 取出三个数中最小的数,并添加到集合中
for (int j = 0; j < list.size(); j++) {
n1 = list.get(j) * 3;
if (n1 > last)
break;
}
for (int k = 0; k < list.size(); k++) {
n2 = list.get(k) * 5;
if (n2 > last)
break;
}
for (int z = 0; z < list.size(); z++) {
n3 = list.get(z) * 7;
if (n3 > last)
break;
}
if (n1 > n2)
min = n2;
else
min = n1;
if (min > n3)
min = n3;
list.add(min);
if (min == n)
System.out.println(i);
}
}
}