-
寻找完全数
题目描述
一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子:
输入
N
1=<N<=30000
输出
? its factors are ? ? ?
样例输入
1000
样例输出
6 its factors are 1 2 3
28 its factors are 1 2 4 7 14
496 its factors are 1 2 4 8 16 31 62 124 248
解题思路: 先求因子数 但这道题的因子很显然没有本身 且 因子不可能超过自己的一半 那么我们就直接循环 i / 2次就好了, 再循环里:累加因子的值 如果累加的值 等于本身 那么他就是完全数 此时要注意的是 判断累加因子值是否等于本身 这个判别式要放在内循环外 因为如果不放 就会有 “24”BUG 因为24的因子有 “24 its factors are 1 2 3 4 6 8 12”
如果你放在内循环里 就判断到1 2 3 4 6 8 就会等于24 显示24 是完全数 其实24并不是完全数 因为后面有个 12 ,这个BUG值得去学习。代码如下:认真看注释:
import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(),sum = 0; //num代表求num以内的值,sum代表累加因子数 String str = " its factors are"; //定义字符串 作 ”中介” for(int i = 1;i<=num;i++) { //循环num此 str = " its factors are"; //每次循环前 让str回到初始值 sum=0; //每次循环前 让sum回到初始值 for (int j = 1; j <= i / 2; j++) { //循环 i/2次 因为因子不可能超过自己本身一半(除了本身) if (i % j == 0) { //判断j是否是因子数 sum += j; //累加j(因子)的值 str += (" " + j); //把因子前面加空格 并 转换成字符串 累加到str中 } } if (sum == i) { //注意这一步!为什么不放在内循环里面 因为放在内循环里面会出现24 BUG,即求出所有因字数后再判断 System.out.println(i + str); //输出i(完全数)+str(累加的str) } } } }
完。