使用Java打印1-100之间的完全数

swvgeqrz  于 2023-01-24  发布在  Java
关注(0)|答案(8)|浏览(238)

我不知道我的代码有什么问题。它应该打印1-100之间的所有完全数。我尝试了嵌套的for循环,do while循环和for循环。但是,代码似乎不正确。

class CompProject1
{

    public static void main()

    {

        int num, sum=0;

        int i;

        for(num=1; num<100; num++)

        {

           for(int j = 1; j<=num ; j++)

           {

               if(num%j==0)

               {

                   sum = sum+j;

                }

            }

           if(sum==num)

           {

             System.out.println(sum);  

            }
        }
    }
}
ybzsozfc

ybzsozfc1#

将代码更改为:

public static void main(String[] s1) throws Exception {
    int num, sum = 0;
    int i;
    for (num = 1; num < 100; num++) {
        for (int j = 1; j <= num - 1; j++) {   // change made here
            if (num % j == 0) {
                sum = sum + j;
            }
        }
        if (sum == num) {
            System.out.println(sum);
        }
        sum = 0;                              // change made here
    }

}

要点:
1.内部迭代完成后,将sum重置为0
1.在 * inner * for-loop中,您需要检查是否为till num - 1而不是num,因为每个数字都可被自身整除

mhd8tkvw

mhd8tkvw2#

1)你肯定需要为每次迭代重置sum变量,所以你应该在每个循环中执行int sum = 0;
2)你需要迭代while j <= num/2;
3)考虑使用Java8,我将在这里为您编写一些示例。
看看我的例子,这是如此美丽:

public class PerfectNumbersDemo {

  public static void main(String[] args) {
    IntStream.range(1, 100)
        .filter(PerfectNumbersDemo::isPerfect)
        .forEach(System.out::println);
  }

  private static boolean isPerfect(int number) {
    return number == IntStream.rangeClosed(1, number / 2)
        .filter(i -> number % i == 0)
        .sum();
  }
}
lokaqttq

lokaqttq3#

这似乎是一个作业或家庭作业问题。你应该自己解决这个问题,而不是问堆栈溢出上的人。
然而,你所寻找的有一个答案here。注意!这个代码打印输入的数字是否是完全数,但不打印所有低于100的数字,可能是完全数。这是你的家庭作业。

5f0d552i

5f0d552i4#

您需要:

  • 每次循环迭代时sum = 0
  • 迭代直到< num而不是<= num

以下是固定代码:

public static void main(String[] args)  {

int sum;
for(int num = 1; num < 100; num++) {

    sum = 0;

    for(int j = 1; j< num; j++) {
        if(num % j == 0) {
            sum += j;
        }
    }

    if(sum == num) {
        System.out.println(sum);
    }
}

}
输出:
6
28

g0czyy6m

g0czyy6m5#

所以,你的代码有一些小问题,我会尽力找出他们.
1.首先,sum变量应该在第一个for循环中
2.第二个循环的极限是j<num,而不是j<=num,因为对于完全数来说,这个数本身不应该计入和。
您的代码将如下所示。
我不知道我的代码有什么问题。它应该打印1 - 100之间的所有完全数。我尝试了嵌套的for循环,do while循环和for循环。但是,代码似乎不正确。

class CompProject1 {

public static void main()

{

     int num;

     for(num=1; num<100; num++)

     {

         int sum = 0;

         for(int j = 1; j<=num ; j++)

         {

              if(num%j==0)

              {

               sum = sum+j;

              }

       }

       if(sum==num)

       {

        System.out.println(sum);  

        }
    }
 }
}
k3bvogb1

k3bvogb16#

public class factors{
public static void main(String args[]){
    int sum=0;

    for(int k=2;k<=30;k++){
    for(int i=1;i<k;i++)
    {
        if(k%i==0)
            sum=sum+i;

    }
       if(k==sum)
             System.out.println(sum);

        sum=0;          //sum=0 is very important.
    }

}

}

输出

6
28
sauutmhj

sauutmhj7#

class PERFECT
 {
    public static void main(String args[])
     {
         int i,j,S,
          for(i=1;i<=100;i++)
          {
          S=0
          for(j=1;j<i;j++)
          {
          if(i%j==0)
           S+=j;
           if (S==i)
           System.out.println(i+"is perfect");
           }
           }
           }
           }
o3imoua4

o3imoua48#

下面是查找perfect numbers的另一种方法。

  • 如果2 p-1是素数,当p是素数时,**(2 p-1)(2 p-1)**是完全数,2 p-1称为梅森素数
  • 由于这些数字真实的大,因此建议使用BigInteger

这将计算前10个完全数。

int N = 10;
int count = 1;
for(int i = 2; i < 10_000; i += i == 2 ? 1 : 2) {
    BigInteger val = BigInteger.valueOf(i);
    if (val.isProbablePrime(99)) {
        BigInteger mersenne1 = (BigInteger.ONE.shiftLeft(i)).subtract(BigInteger.ONE);
        if (!mersenne1.isProbablePrime(99)) {
            continue;
        }
        
        BigInteger mersenne2 = BigInteger.ONE.shiftLeft(i-1);
        System.out.printf("%3d:  %,d\n",count, mersenne1.multiply(mersenne2));
       
        if (count++ >= N) {
            break;
        }
    }   
}

印刷品

1:  6
  2:  28
  3:  496
  4:  8,128
  5:  33,550,336
  6:  8,589,869,056
  7:  137,438,691,328
  8:  2,305,843,008,139,952,128
  9:  2,658,455,991,569,831,744,654,692,615,953,842,176
 10:  191,561,942,608,236,107,294,793,378,084,303,638,130,997,321,548,169,216

相关问题