讨论/算法和数据结构/一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程 找出1000内所有的完数。/
一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程 找出1000内所有的完数。

//7、一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程
//找出1000内所有的完数。

public class Exe05 {
public static void main(String[] args) {
boolean zhishu = true;
boolean wanshu = true;
int sum = 0;
for (int x = 1; x < 1000; x++) {
for (int i = 1; i < Math.sqrt(x); i++) {
if (x % i == 0) {
zhishu = false;
} else if (x % i != 0) {
zhishu = true;}
}
if (zhishu = true) {
wanshu = false;
}
if(zhishu=false) {
for(int j=1;j<x;j++) {
if(x%j==0) {
sum+=j;
}

		}
			if(sum==x) 
			{
				wanshu=true;
			}
			else {
				wanshu=false;
			}
		}
          if(wanshu==true) {
			System.out.println(x+"是完数");				
		}
	}
	
			
		}
	}

//程序运行出来没有结果,有没有大佬能帮我看看哪里错了,怎么改才好。

展开讨论
Sdream发起于 2020-05-15
最近编辑于 2020-05-15
共 2 个讨论

把代码放代码框,不然没有缩进看起来吃力
首先,
这一块你好好读一遍,这块只有最后一次的判断是算的,并不能判断出其是否是素数。话说这个判断其实是不必要的。

for (int i = 1; i < Math.sqrt(x); i++) {
    if (x % i == 0) {
        zhishu = false;
    } else if (x % i != 0) {
        zhishu = true;
    }
}

其次,

if (zhishu = true) {

if (zhishu = false) {

都是赋值语句而不是判断语句。
最后,你sum、zhishu、wanshu用完后在下个循环没有置0归位。

再补,
变量名不要用拼音,运算符前后加空格,规范正确换行和缩进。

再再补,
数据规模如果大一点就不能用循环了,这题应该有数学方法才对。

3

不过写这个判断确实有点多次一举。
直接判除以因数就行了。


//7、一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程
//找出1000内所有的完数。

public class Exe05 {
	public static void main(String[] args) {
		int sum = 0;
		for (int x = 1; x <= 1000; x++) {
			sum = 0;
			for (int i = 1; i < x; i++) {
				if(x%i==0) {
                 sum+=i;
				}
				
			}
				if(sum==x) 
				{
				System.out.println(x+"是完数");				
			}
				}
			}
             
		
				
			}