Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 丰富的总数、逻辑_Java_Arrays_Perfect Numbers - Fatal编程技术网

Java 丰富的总数、逻辑

Java 丰富的总数、逻辑,java,arrays,perfect-numbers,Java,Arrays,Perfect Numbers,我一直在研究下面的问题,但我得到了错误的答案。我的逻辑有什么问题 一个完全数是一个数,它的适当因子之和正好等于这个数。例如,28的适当除数之和为1+2+4+7+14=28,这意味着28是一个完全数 如果一个数n的真因子之和小于n,则称其为亏数;如果该和大于n,则称其为丰数 因为12是最小的富足数,1+2+3+4+6=16,所以可以写成两个富足数之和的最小数是24。通过数学分析,可以证明所有大于28123的整数都可以写成两个富足数之和。然而,通过分析无法进一步降低该上限,即使已知不能表示为两个丰富

我一直在研究下面的问题,但我得到了错误的答案。我的逻辑有什么问题

一个完全数是一个数,它的适当因子之和正好等于这个数。例如,28的适当除数之和为1+2+4+7+14=28,这意味着28是一个完全数

如果一个数n的真因子之和小于n,则称其为亏数;如果该和大于n,则称其为丰数

因为12是最小的富足数,1+2+3+4+6=16,所以可以写成两个富足数之和的最小数是24。通过数学分析,可以证明所有大于28123的整数都可以写成两个富足数之和。然而,通过分析无法进一步降低该上限,即使已知不能表示为两个丰富数之和的最大数小于该上限

求所有不能写成两个富足数之和的正整数之和

这是我的密码:

   public class EulerProblem23 {
public static void main(String[] args) {
    
    //First, I create an array containing all the numbers ranging from 1 to 28123.
    int[] tall = new int[28123];
    int x = 0;
    for (int j = 1;j<=28123;j++){ 
        tall[x] = j;
        x++;
    }
    
    //Then, give all the numbers that can be written as the sum of two abundant numbers
    //the value 0.
    int forrige = 0;
    for (int i = 1;i<=28123;i++){
        if (isAbundant(i)){
            if (2 * i <= 28123){
                tall[i - 1] = 0;
            }
            if (forrige + i <= 28123){
                tall[i - 1] = 0;
            }
        }
    }
    
    //All that's left should be summing all the numbers in the array.
    
    long sum = 0;
    for (int y = 0;y<28123;y++){
        sum += tall[y];
    }
    
    System.out.println(sum);    
    
}

public static boolean isAbundant(int n){
    int sumAvDivisorer = 0;
    for (int i = 1;i<n;i++){
        if (n % i == 0){
            sumAvDivisorer += i;
        }
    }
    
    if (sumAvDivisorer > n){
        return true;
    }
    else {
        return false;
    }
}
    }
公共类EulerProblem23{
公共静态void main(字符串[]args){
//首先,我创建一个数组,其中包含从1到28123的所有数字。
int[]高=新int[28123];
int x=0;

对于(int j=1;j而言,此代码毫无意义:

//Then, give all the numbers that can be written as the sum of two abundant numbers
//the value 0.
int forrige = 0;
for (int i = 1;i<=28123;i++){
    if (isAbundant(i)){
        if (2 * i <= 28123){
            tall[i - 1] = 0;
        }
        if (forrige + i <= 28123){
            tall[i - 1] = 0;
        }
    }
}
//然后,将所有可以写成两个充裕数之和的数
//值为0。
int-forrige=0;

对于(int i=1;i我会这样做:

  • 把所有丰富的数字组成一个数组
  • 将所有对添加到一起。您可以使用嵌套的
    for
    循环来完成此操作
  • 对于每一对与小于或等于
    28123
    的数字相加的数字,将该对的总和添加到总和中

什么是
forrige
i
将始终小于或等于
28123
,因此您将数组中的所有值设置为
0
@Blender:不,我没有。forrige是获取for循环中的前一个值。我数组中的所有值都没有设置为0,这是不正确的。噢,糟糕,对不起,您是对的。我忘了在循环结束时设置forrige=i。虽然在循环结束时设置了
forrige=i
,但我似乎仍然得到了错误的答案。你的代码如何检查一个数字是否是小于28123的任意两个富足数之和?从数学上讲,我能不能:1.找到富足数2.将其乘以2。这个数字是两个富足数之和。3.将富足数与前一个富足数相加。该数字是两个富足数之和。我看不出该逻辑中的错误。正如你所解释的,你会发现一些数字是两个富足数之和。这不是所要求的。你必须确保所有的p可能和