【问题标题】:Check for perfect number using boolean使用布尔值检查完美数
【发布时间】:2016-10-22 17:49:35
【问题描述】:

我的 Java 编码有问题,无法使用布尔方法找到完美数字。我想像这样打印出来: 例子 : '6 是一个完美的数字。 6 是 1、2、3' 的总和 否则 : ‘9 不是一个完美的数字’

但我不知道如何使“6 是 1、2、3 的总和”的编码。谁能帮我? 这是我的编码:

import java.util.Scanner;

public class trial
{
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

        Scanner perfect = new Scanner(System.in);
        System.out.print("Enter any integer number : ");
        int n = perfect.nextInt();

        if(isPerfectNumber(n))
        {
            System.out.println(n+" is a perfect number");

        }
        else
        {
            System.out.println(n+" is not a perfect number");
        }
    }

    public static boolean isPerfectNumber(int n)
    {
        int sum = 0;
        for (int i=1; i<n; i++)
        {
            if (n%i == 0)
            {
                sum = sum + i;
            }
        }
        if (sum == n)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

【问题讨论】:

    标签: java boolean perfect-numbers


    【解决方案1】:

    嗯,您已经知道如何根据if (n%i == 0) 行获取数字的因数。

    所以,只提示,因为这几乎可以肯定是课堂作业。

    在将因子添加到总和的同时,您应该将其添加到某个描述的列表中,并使其可用于调用函数。

    一种可能性是返回一个列表,第二个和后续元素是给定数字的所有因素,第一个元素是这些因素的总和。

    因此,对于6,您将获得列表{6, 1, 2, 3}12 将给您{16, 1, 2, 3, 4, 6},而7 将给您{7, 1}

    这样,您只需对照第一个元素检查原始数字,如果它们相等,则打印出其他元素。也就是说,伪代码如:

    input num
    factorList = getFactorList(num)
    if factorList[0] == num:
        print num, " is perfect, factors are:"
        for idx = 1 to factorList.size() - 1 inclusive:
            print " ", factorList[idx]
        println "."
    else:
        println num, " is not perfect."
    

    【讨论】:

      【解决方案2】:

      如果不是完美的数字,我会更改 isPerfectNumber 以返回构成 nnull 的因素的 List。然后你有一个结果,它既包含因子,也可以用来确定n 是否完美:

      public static void main(String[] args) {
          Scanner perfect = new Scanner(System.in);
          System.out.print("Enter any integer number : ");
          int n = perfect.nextInt();
      
          List<Integer> factors = getPerfectFactors(n);
          if (factors != null) {
              System.out.println
                  (n + " is a perfect number. It's the sum of" +
                   factors.stream()
                          .map(String::valueOf)
                          .collect(Collectors.joining(", "));
          } else {
              System.out.println(n+" is not a perfect number");
          }
      }
      
      public static List<Ingeger> getPerfectFactors(int n) {
          int sum = 0;
          List<Ingeger> factors = new LinkedList<>();
          for (int i = 1; i < n; i++) {
              if (n % i == 0)  {
                  sum += i;
                  factors.add(i);
              }
              if (sum > n) { // Early return optimization, not material to the solution
                  return null;
              }
          }
          if (sum == n) {
              return factors;
          } else {
              return null;
          }
      }
      

      【讨论】:

      • 但是我必须使用布尔方法来解决这个问题
      【解决方案3】:

      如果条件为真,则在 for 循环中,如果模数为真,那么您知道 i 必须以某种方式保持在轨道上。

      所以我会 声明一个整数数组列表以跟踪总和数。

      ArrayList<Integer> numbs = new ArrayList<Integer>();
      

      然后

      public static boolean isPerfectNumber(int n)
      {
              int sum = 0;            
              for (int i=1; i<n; i++)
              {
                  if (n%i == 0)
                  {
                      numbs.add(i);  //here keep track of those summation numbers
                      sum = sum + i;
                  }
              }
              if (sum == n)
              {
                  return true;
              }
              else
              {
                  return false;
              }
      }
      

      现在在打印时你可以做类似的事情

      System.out.println(n + " is a perfect number. " + n + " is sum of " + StringUtils.join(numbs, ","));
      

      别忘了导入 StringUtils:import org.apache.commons.lang3.StringUtils commons-lang3 库。

      【讨论】:

      • 我做了你建议我做的,但为什么我仍然在我的程序中发现一些错误?代码变成这样:
      • 导入 java.util.Scanner;导入 org.apache.commons.lang3.StringUtils; public class test { public static void main(String[] args) { // TODO 自动生成的方法存根 ArrayList numbs = new ArrayList();完美扫描仪 = 新扫描仪(System.in); System.out.print("输入任意整数:"); int n = 完美.nextInt(); if(isPerfectNumber(n)) { System.out.println(n+" 是一个完美数"); System.out.println(n+" 是 " + StringUtils.join(numbs, ",")); } else { System.out.println(n+" 不是完美数"); } }
      • public static boolean isPerfectNumber(int n) { int sum = 0; for (int i=1; i
      • 我会说你逐步调试代码。也总是更新你原来的问题。不要在 cmets 框中编写代码。
      • 你能帮我写完整的代码吗?因为我不懂你的意思,因为我只是初级程序员
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多