所以我是一个java newby,我正在做这个家庭作业,要求我写一个程序来找到前四个完美的数字。我想我的一切都大致正确,但我无法测试我的程序,因为我尝试运行程序时出现错误消息“线程异常”主“javva.lang.NoSuchMethodError:main”。编译得很好,我认为所有数学都是正确的:
import java.awt.*;
public class PerfectNumbers
{
int num = 1, divisor1 = 1, divisor2, divSum, perfNum1, perfNum2, perfNum3, perfNum4;
public void main()
{
do
{
while (num != divSum)
{
if (num % divisor1 == 0 && divisor1 != Math.sqrt(num))
{
divSum += divisor1;
divisor2 = num / divisor1;
divSum += divisor2;
divisor1++;
}
else if (num % divisor1 !=0 && divisor1 != Math.sqrt(num))
divisor1++;
else if (divisor1 == Math.sqrt(num))
{
divSum += Math.sqrt(num);
divisor1 = 1;
}
}
if (num == divSum && perfNum1 == 0)
{
perfNum1 = num;
num++;
divSum = 0;
}
else if (num == divSum && perfNum2 == 0)
{
perfNum2 = num;
num++;
divSum = 0;
}
else if (num == divSum && perfNum3 == 0)
{
perfNum3 = num;
num++;
divSum = 0;
}
else if (num == divSum && perfNum4 == 0)
{
perfNum4 = num;
break;
}
}
while (perfNum4 == 0);
if (perfNum4 == 0)
System.out.print("The first four perfect numbers are "
+ perfNum1 + ", " + perfNum2 + ", " + perfNum3 + ", "
+ perfNum4 + ".");
}
}
P.S。任何关于newb语法或风格错误的建议都将不胜感激!
答案 0 :(得分:8)
public void main()
应该是
public static void main(String[] args)
答案 1 :(得分:2)
请记住,以下是编码最佳实践,程序仍然可以编译并运行正常,而不进行以下更改。
您没有使用任何awt组件,因此您可以删除该import语句。
每行只写一个变量声明和初始化语句。 (参见第4行。)。这简化了调试工作和可维护性。
int num = 1, divisor1 = 1, divisor2, divSum, perfNum1, perfNum2, perfNum3, perfNum4;
对于最后一个if()语句,请提供打开和关闭的括号,即使只有一行。这将提高代码的可读性。因此,即使其他程序员接受了您的代码,也不会混淆代码行。
正如其他人提到的,你需要为main方法提供静态修饰符。
答案 2 :(得分:1)
基于您当前代码的两个修复程序。
修复一个 - 将变量从类范围移动到主方法的范围
目前,您的变量位于main方法之外,但在类中。由于main
方法是静态的,因此它们不能引用它们,因为它们是PerfectNumbers类的每个实例的变量(并且您没有创建PerfectNumbers类的实例)。
变化:
int num = 1, divisor1 = 1, divisor2, divSum, perfNum1, perfNum2, perfNum3, perfNum4;
public static void main(String[] args)
{
到
public static void main(String[] args)
{
int num = 1, divisor1 = 1, divisor2, divSum, perfNum1, perfNum2, perfNum3, perfNum4;
修复两个 - 初始化变量
对于原始类型(如int
),需要保证Java已经初始化了变量。由于您目前正在初始化条件语句中的变量,因此无法100%保证Java将被初始化。
变化:
int num = 1, divisor1 = 1, divisor2, divSum, perfNum1, perfNum2, perfNum3, perfNum4;
到
int num = 1, divisor1 = 1, divisor2 = 1, divSum = 0, perfNum1 = 0, perfNum2 = 0, perfNum3 = 0, perfNum4 = 0;
注意:这些更改将使您的代码编译,但它还不正确。由于这是家庭作业,请试着看看你是否可以尝试自己修复它。
进行一些清理以使事情看起来更好
清理一个(由@ Sarma7指出)
删除此行:
import java.awt.*;
因为你没有使用这个包中的任何方法/变量。
清理两个
每行初始化一个变量是一种很好的方式(如果在没有初始化的情况下声明,那么你可以把它放在同一行上)。
e.g。
int num = 1;
int divisor1 = 1;
int divisor2 = 1;
int divSum = 0;
int perfNum1 = 0;
int perfNum2 = 0;
int perfNum3 = 0;
int perfNum4 = 0;
答案 3 :(得分:1)
完全数是一个正整数,等于其正确的除数之和,即除数除数之外的正除数之和。同样地,一个完美的数字是所有正除数之和的一半。第一个完全数是6,因为1,2和3是正确的除数,1 + 2 + 3 = 6.等价,数字6等于所有正除数之和的一半:(1 + 2 + 3 + 6)/ 2 = 6。
公共类IsPerfectNumber {
public boolean isPerfectNumber(int number){
int temp = 0;
for(int i=1;i<=number/2;i++){
if(number%i == 0){
temp += i;
}
}
if(temp == number){
System.out.println("It is a perfect number");
return true;
} else {
System.out.println("It is not a perfect number");
return false;
}
}
public static void main(String a[]){
IsPerfectNumber ipn = new IsPerfectNumber();
System.out.println("Is perfect number: "+ipn.isPerfectNumber(28));
}
}
答案 4 :(得分:0)
这样做:
public static void main(String[] args) {
new PerfectNumbers().main();
}
所有字段都是实例字段(即非静态字段),因此无法从static
方法引用它们(它们只能从实例引用),因此创建一个PerfectNumbers
对象,然后在其上调用main
方法。
答案 5 :(得分:0)
我认为你应该首先了解一些关于OOP概念,然后是static
的含义。您需要static main
方法才能启动。在main方法内部,您可以使用其他静态字段,或者首先必须实例化某些对象,然后才能使用该对象的字段。然后赶上@波希米亚人的回答