简单的Java作业

时间:2011-09-08 06:17:11

标签: java math

所以我是一个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语法或风格错误的建议都将不胜感激!

6 个答案:

答案 0 :(得分:8)

public void main()

应该是

public static void main(String[] args)

答案 1 :(得分:2)

请记住,以下是编码最佳实践,程序仍然可以编译并运行正常,而不进行以下更改。

  1. 您没有使用任何awt组件,因此您可以删除该import语句。

  2. 每行只写一个变量声明和初始化语句。 (参见第4行。)。这简化了调试工作和可维护性。

    int num = 1, divisor1 = 1, divisor2, divSum, perfNum1, perfNum2, perfNum3, perfNum4;
    
  3. 对于最后一个if()语句,请提供打开和关闭的括号,即使只有一行。这将提高代码的可读性。因此,即使其他程序员接受了您的代码,也不会混淆代码行。

  4. 正如其他人提到的,你需要为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方法内部,您可以使用其他静态字段,或者首先必须实例化某些对象,然后才能使用该对象的字段。然后赶上@波希米亚人的回答