首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我想找出前10个友好的组合,只使用数组、循环和条件,但我对java和编程一般都很陌生。

我想找出前10个友好的组合,只使用数组、循环和条件,但我对java和编程一般都很陌生。
EN

Stack Overflow用户
提问于 2016-12-05 23:23:08
回答 1查看 177关注 0票数 0

我想我知道如何将除法和输入到数组上的单元格中,但却纠结于如何在数组之间进行比较并打印出10对。

到目前为止我的代码如下:

代码语言:javascript
运行
复制
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;
        }
    }

} 
EN

回答 1

Stack Overflow用户

发布于 2016-12-06 01:02:03

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

代码语言:javascript
运行
复制
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来比较这些对,如下所示:

代码语言:javascript
运行
复制
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 %d\n", first, second);
          cnt++;
      }
   }
   first++;
   if (first >= arr.length) {
        break;
   }
}

第一次检查是为了避免数组索引溢出,second > first检查是为了确保我们只向前看,不会两次重新发现对。

然后主要的检查是first == arr[second],它是友好数字。它的意思是,如果第二个数的因子之和,实际上是第一个数的因子之和,是第一个数本身,那么这些数就是友好的对。

旁注:程序可能可以用其他更好的方式编写。例如,当求和时,循环到所讨论数字的平方根就足够了,因为除数相互镜像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40977563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档