这是一个练习。
完美数是一个数,其除数之和不包含自身,等于该数6是一个完美数,因为它的除数是:1,2,3,6和1+2+3=628是一个完美数,因为它的除数是:1,2,4,7,28和1+2+4+7=28
任务:编写findNPerfectNumbers的主体,它将找到n个素数完美数,并将其作为列表返回
我必须使用这个程序:
import java.util.ArrayList;
public class Exercise {
public static ArrayList<Integer> findNPerfectNumbers(int n)
{
return new ArrayList<>();
}
public static void main(String[] args)
{
System.out.println(findNPerfectNumbers(4));
}
}
我创建这段代码是为了解决这个问题,但我有一个返回ArrayList的问题。我不知道怎么做。它应该看起来像这个例子:6=1,2,3,6/////28=1,2,4,7
我的想法:
import java.util.ArrayList;
public class Main
{
public static ArrayList<Integer> findNPerfectNumbers(int n)
{
int sum = 0;
ArrayList<Integer> perfectList = new ArrayList<>();
ArrayList<Integer> factorList = new ArrayList<>();
for (int i = 6; i < n; i++)
{
factorList.clear();
for (int j = 1; j <= i / 2; j++)
{
if (i % j == 0)
{
factorList.add(j);
}
}
sum = 0;
for (int h = 0; h < factorList.size(); h++)
{
sum = sum + factorList.get(h);
}
if (sum == i)
{
perfectList.add(i);
}
}
return perfectList;
}
public static void main(String[] args)
{
System.out.println(findNPerfectNumbers(28));
}
}
有人有主意吗?
问题很简单,只需让findNPerfectNumbers
函数返回前N个完全数即可。
练习的主要部分可能是尽可能有效地做到这一点。例如,像在for (int j = 1; j <= i / 2; j++)
中那样将除法器检查限制为一半是许多选项之一。
函数不返回任何内容的原因是,对于给定的4输入,外部for循环不正确。您所做的是for (int i = 6; i < 4; i++)
,它不执行任何循环,因为4小于6。你可能想做的是像for (int i = 6; perfectList.size() < n; i++)
这样的事情,只要你有少于N个完美数,它就会循环。
示例工作代码:
import java.util.ArrayList;
public class Exercise {
public static ArrayList<Integer> findNPerfectNumbers(int n) {
int sum = 0;
ArrayList<Integer> perfectList = new ArrayList<>();
for (int i = 6; perfectList.size() < n; i++) {
ArrayList<Integer> factorList = new ArrayList<>();
for (int j = 1; j <= i / 2; j++) {
if (i % j == 0) {
factorList.add(j);
}
}
sum = 0;
for (Integer factor : factorList) {
sum += factor;
}
if (sum == i) {
System.out.println("Found perfect number " + i + " with factors " + factorList);
perfectList.add(i);
}
}
return perfectList;
}
public static void main(String[] args) {
System.out.println(findNPerfectNumbers(4));
}
}
如果数字小于10^1500,可以使用欧几里得的方法
public static List<Long> findPerfect(int n){
List<Long> perfectList=new ArrayList<>();
int x=0;
long sum=0;
long last;
while(perfectList.size()!=n){
last= (long) Math.pow(2,x);
sum+=last;
if(isPrime(sum))
perfectList.add(sum*last);
x++;
}
return perfectList;
}
public static boolean isPrime(long x){
if(x==1)
return false;
for (int i = 2; i <= Math.sqrt(x); i++) {
if(x%i==0)
return false;
}
return true;
}