0

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

但我不知道如何编写“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;
        }
    }
}
4

3 回答 3

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."
于 2016-10-22T09:33:43.770 回答
1

我会改变isPerfectNumber以返回一个List因素,n或者null它不是一个完美的数字。然后你有一个结果,它既包含因素,又可以用来确定是否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;
    }
}
于 2016-10-22T09:49:35.497 回答
0

如果条件为真,那么在 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库。

于 2016-10-22T09:47:46.573 回答