我想找到仅使用数组,循环和条件的10个第一个友好对,但我对Java和编程非常陌生



我想我知道如何在数组上输入分区总和,但粘在如何在数组之间进行比较并打印10对。

到目前为止我的代码:

public static void main(String[] args) {
    int sum1=0,sum2=0;
    int[] arr1=new int[67000];
    int[] arr2=new int[67000];
    for(int i =0;i<=10;i++){
        for(int j =1;j<arr1.length;j++){
            for(int k =0;k<j;k++){
                if(j%k==0){
                    sum1+=k;
                }
            }arr1[j]=sum1;
        }
        for(int j =1;j<arr2.length;j++){
            for(int k =0;k<j;k++){
                if(j%k==0){
                    sum2+=k;
                }
            }arr2[j]=sum2;
        }
    }
} 

您在两个数组中都计算相同的值。只需创建一次数组即可。

for (int j = 2; j < arr.length; j++) {
    int sum = 0;
    for (int k = 1; k < j; k++) {
        if (j % k == 0) {
            sum += k;
        }
    }
    arr[j] = sum;
}

现在,在这里, arr[n]是数字n的适当除数的总和。

我们可以通过arr循环为:

来比较这些对
int cnt = 0, first = 2;
while(cnt < 10) {
   int second = arr[first]; 
   if (second >= arr.length) {
        continue;
   }
   if (second > first) {
      if (first == arr[second]) {
          System.out.printf("%d %dn", first, second);
          cnt++;
      }
   }
   first++;
   if (first >= arr.length) {
        break;
   }
}

第一份检查是避免超越数组索引,second > first检查是确保我们只能期待而不是两次重新发现一对。

然后主检查是first == arr[second],这是友好的数字。说的是,如果第二个数字的除数之和实际上是第一个数字的分数总和是第一个数字本身,那么数字是友好的对。

旁注:该程序可能可以以其他更好的方式编写。例如,当找到总和时,将循环到所讨论的数字的平方根已经足够了,因为彼此 mirror 彼此。

最新更新