打印所有水仙花数;找出1000以内的完数;猴子吃桃问题;1、2、3、4组成的互不相同且无重复数字的三位数;这些是在整理学习资料的时候,无意间翻到以前学习的一些练习题,当时觉得挺有意思的,所以决定分享一下。
1、打印出所有的“水仙花数”。
所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例 如:153 是一个“水仙 花数”,因为 153 = 1 的三次方+5 的三次方+3 的三次方。
解题思路:for循环取余,并求各位数立方和即可,这里需注意一个方法 Math.pow(a, b) ,及求的是a的b次方
public void test1() {
for (int i = 100; i >= 100 && i <= 1000; i++) {
//取余,a取个位数,b取十位数,c取百位数(123/100%10=1%10)
int a = i % 10;
int b = i / 10 % 10;
int c = i / 100 % 10;
double x = Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3);
if (x == i) {
System.out.println(x);
}
}
}
结果如下:
2、有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都有哪些?
解题思路:循环遍历所有三位数(给定范围内的三位数也可以),然后对每个三位数进行取余处理,判断取余之后的数的范围,并比较是否相等,最后统计输出。
public void test2() {
int a, b, c;
int count = 0;
for (int i = 100; i < 500; i++) { //遍历500内的所有三位数
a = i % 10; // 取个位数
b = i / 10 % 10; // 取十位数
c = i / 100 % 10; // 取百位数 123/100%10 = 1%10
if (a <= 4 && a > 0 && b <= 4 && b > 0 && c <= 4 && c > 0) { //判断各个数是否符合条件
if (a != b && a != c && b != c) { //判断是否重复
System.out.println(i);
count += 1;
}
}
}
System.out.println("个数为:" + count);
}
结果如下:
3、编程找出 1000 以内的所有完数。
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如 6 = 1+2+3。
解题思路:for循环嵌套,第一层2开始,第二层1开始且不能大于第一层的数,第二层循环嵌套中进行取余操作,将因子进行相加后与原数比较
public void test3() {
for (int i = 2; i <= 1000; i++) {
int sum = 0; // sum 不放在外层for里会导致sum将每次循环的数一直加起来,不会重新初始化
for (int j = 1; j < i; j++) { //寻找i的因子并进行相加
if (((i % j) == 0)) {
sum += j;
}
}
if (sum == i) { //判断是否为完数
System.out.println(sum);
}
}
}
4、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
解题思路:这题其实很简单,只要逆向思考就可以了。第十天早上还剩下一个,第九天就吃了前一天的一半加一个,导致吃完后只剩下一个,因此前一天应该剩下 (1+1)*2 = 4个,以此类推即可计算出第一天的个数。
public void test4() {
int sum = 1;
for (int i = 1; i < 10; i++) {
sum = (sum + 1) * 2;
}
System.out.println(sum);
}
结果如下: