我在java中尝试了这个程序,用于最多1000个整数的有界常量输入。没有得到预期的输出:(
package perfect.numbers;
import java.util.ArrayList;
public class PerfectNumbers {
public static void main(String[] args) {
long num=1000; int sum = 0;
ArrayList<Integer> perfectList = new ArrayList<>();
ArrayList<Integer> factorList = new ArrayList<>();
for(int i=1; i<num; i++)
{
for(int j=1; j<i/2; j++)
{
if(i%j==0)
{
factorList.add(j);
}
for(int h=0; h<factorList.size(); h++)
sum=sum+factorList.get(h);
if(sum==i)
perfectList.add(i);
sum=0;
}
}
System.out.println("The Perfect numbers upto 1000 are : ");
for(Integer item : perfectList)
{
System.out.print(item + "/t");
}
}
}
答案 0 :(得分:2)
您的代码有多个问题:
这是正确的版本:
import java.util.ArrayList;
public class PerfectNumbers {
public static void main(String[] args) {
long num = 1000;
int sum = 0;
ArrayList<Integer> perfectList = new ArrayList<>();
ArrayList<Integer> factorList = new ArrayList<>();
for (int i = 6; i < num; i++) {
factorList.clear();
for (int j = 1; j <= i / 2; j++) {
if (i % j == 0) {
factorList.add(j);
}
}
sum = 0;
for (int h = 0; h < factorList.size(); h++) {
sum = sum + factorList.get(h);
}
if (sum == i) {
perfectList.add(i);
}
}
System.out.println("The Perfect numbers upto 1000 are : ");
for (Integer item : perfectList) {
System.out.print(item + "/t");
}
}
}
答案 1 :(得分:1)
我认为你的Inner for循环应该是这样的:
for(int j=1; j<=i/2; j++)
{
if(i%j==0)
{
factorList.add(j);
}
}
for(int h=0; h<factorList.size(); h++)
sum=sum+factorList.get(h);
if(sum==i)
perfectList.add(i);
sum=0;
这里我在执行总和之前关闭了内部forloop。在你的情况下发生了什么,每当一个满足条件i%j==0
的新数字,总和被计算,如果总和不等于i,则sum被重置为0.这导致问题。
我将内部for循环更改为j<=i/2
。解释:取i = 6.而我们知道因子为6:1,2,3。现在如果j<i/2
是循环内部,那么它将忽略数字3并退出该实例,因此我们永远不会在因子列表中得到3。希望这能回答你所有的问题。
答案 2 :(得分:1)
通过谷歌找到答案,根据您的要求更新
您期望低于输出
最多1000的完美数字是: 0 6 28 496
public class PerfectNumbers {
public static boolean isPerfectNumber(int number){
int temp = 0;
for(int i=1;i<=number/2;i++){
if(number%i == 0){
temp += i;
}
}
if(temp == number){
return true;
} else {
return false;
}
}
public static void main(String[] args) {
System.out.println("The Perfect numbers upto 1000 are :");
for (int i=0;i<= 1000; i++){
if(PerfectNumbers.isPerfectNumber(i)){
System.out.println(i);
}
}
}
}
答案 3 :(得分:1)
答案 4 :(得分:1)
你的内循环中存在一个明显的问题(即for
循环,j
作为索引变量):你的结束测试是j<i/2
。这将终止循环,以使j
永远不会达到i/2
,但每个偶数整数i
在其适当的除数中都有i/2
。您需要将结束测试更改为j <= i/2
。
您可能还希望将外部循环中的结束测试更改为i <= num
。否则,您只会检查最多num - 1
的整数。
你还需要移动总和计算并检查内部循环到外部循环,因为你想对每个潜在的完美数字只做一次,而不是每个潜在的正确除数。
答案 5 :(得分:0)
/*
@ Author 12CSE54
@ Date 28.10.14
*/
import java.util.*;
public class perfect {
Scanner s = new Scanner(System.in);
public void check() {
System.out.println("Enter the number\n");
int p = sc.nextInt();
int temp = 0;
for(int i = 1; i <= p / 2; ++i) {
if (p % i == 0)
temp += i;
}
if (temp == p)
System.out.println("It is a perfect number");
else
System.out.println("It is not a perfect number");
}
public static void main(String args[]) {
perfect p1 = new perfect();
p1.check();
}
}