如何对数组列表的元素求和?

Posted

技术标签:

【中文标题】如何对数组列表的元素求和?【英文标题】:How do I sum the elements of an array list? 【发布时间】:2021-09-01 20:04:49 【问题描述】:

我正在尝试使用 while 循环来显示一些计算的结果。

循环中的每次迭代都将两个数字相除,一个数字递增两次,将结果存储在数组列表中,并且应该对数组列表中的所有元素求和。

但是,我的求和结果不正确,我似乎无法弄清楚原因。我应该得到 1956.9272 但它显示 73.3576,知道我做错了什么吗?

这是我的代码:

import java.util.ArrayList;

public class testtest 

    public static void main(String[] args) 
        
        
        // Initialize variables
         double num1 = 1;
         double num2 = 3;
         double sum = 0;
         
        //  A new array list is created
        ArrayList<Double> myCalc = new ArrayList<Double>(); 

         // While loop is started if num2 is lass than 99
         while (num2 <= 99) 
             
             //Divides 1 by num2
              double answer = num1 / num2;
             
             // Adds the result to the array list
              myCalc.add(answer);
             
             // Twice increments num2, which is the denominator
              ++num2;
              ++num2;
              
              // For loop iterates through each element in the array list
              for (Double result : myCalc) 
                  
                  // Sums all the elements in the array list
                  sum += result;
              
                          
         
         
         // Displays the results of adding the array list elements together
        System.out.printf("%.4f", sum);
        
            
    

【问题讨论】:

//Divides num2 by 1 double answer = num1 / num2; - 你确定吗? 糟糕,我的评论没有错。我的意思是“将 1 除以 num2”。 你想在所有其他计算完成后对 myCalc 求和吗?如果是这样,则将该循环for (Double result ... 移到System.out.printf 之前。但是,这并不能完全给出您的预期结果。您的规范需要更清晰一些。 是的,我想将每个计算的所有单独结果存储在 myCalc 中,然后将它们加在一起。基本上是在做等式(1/3)+(1/5)+(1/7)+等。 为什么要使用列表?这可以通过一个循环来完成。是否真的需要对列表的元素求和,但将列表的每个元素乘以某个不断变化的因子? 【参考方案1】:
    double n1 = 1, n2 = 3, result, sum = 0;     
    ArrayList<Double> list = new ArrayList<>();
    
    while( n2 <= 99) 
        result = n1/n2;
        list.add(result);
        n2 += 2;
    
    
    for(double temp: list)
        sum = sum + temp;
    
    System.out.println(sum); //1.9377748484749076

如果你在得到的时候把for循环放在里面

double n1 = 1, n2 = 3, result, sum = 0;     
    ArrayList<Double> list = new ArrayList<>();
    
    while( n2 <= 99) 
        result = n1/n2;
        list.add(result);
        n2 += 2;
            
        for(double temp: list)
           sum = sum + temp;
    
    System.out.println(sum); //73.35762984798366 

【讨论】:

【参考方案2】:

你正在做sum(k = 1 to 49) of 1/(1+2k) * (49+1-k)。或者在java中:

    double sum = 0;
    for (int k = 1; k < 50; ++k) 
        sum += (50.0 - k)/(1 + 2*k);
    

这确实接近 73。

我只能猜测原来的规范也改变了num1或者更有可能 answer 也必须添加到每个数组元素中。

【讨论】:

无论我做什么,我似乎都离我的任务要求越来越远。我只是想做 1/3 + 1/5 + 1/7 + 1/9 + 1/11 + 1/13 + 1/15 + 1/17 + 1/19 + 1/21 + 1/23 + 1/25 + 1/27 + 1/29 + 1/31 + 1/33 + 1/35 + 1/37 + 1/39 + 1/41 + 1/43 + 1/45 + 1/47 + 1 /49 + 1/51 + 1/53 + 1/55 + 1/57 + 1/59 + 1/61 + 1/63 + 1/65 + 1/67 + 1/69 + 1/71 + 1/73 + 1/75 + 1/77 + 1/79 + 1/81 + 1/83 + 1/85 + 1/87 + 1/89 + 1/91 + 1/93 + 1955 + 1/97 + 1/99 ,但我必须使用 while 循环,并且分母必须增加两次。有什么想法或者我应该放弃这个并重新开始吗? 这不是sum for i=1 to 49 of 1.0 / (1 + 2*i)吗?甚至更小。假设真正的答案是 R,你的答案 = A,那么看起来 R = A²/2。在for i in 0 .. n for j in i .. n 中可以看到这样的方形 divby 2。有点你在用数组做什么。 所以,是的:从作业要求的内容重新开始。【参考方案3】:

出于调试目的,让我们执行以下操作: 在 // 初始化变量下添加double ans = 0.0;double answer = num1 / num2; 下添加ans = ans + answer; 后跟System.out.printf("%.4f %.4f %.4f = %.4f\n", num1, num2, answer, ans);

这将显示运行总计和总计的增量。我明白了

  1.0000 3.0000 0.3333 =  0.3333
  1.0000 5.0000 0.2000 =  0.5333
  1.0000 7.0000 0.1429 =  0.6762
  1.0000 9.0000 0.1111 =  0.7873
  ...
  1.0000 99.0000 0.0101 =  1.9378

所以,也许作业的总数有误,或者有些东西你没有包括在内。

【讨论】:

以上是关于如何对数组列表的元素求和?的主要内容,如果未能解决你的问题,请参考以下文章

如何对数组列的元素进行切片和求和?

编写对具有n个元素的一维数组求和函数ArraySum()

对数组元素求和

python数组求和

对“列表”列表中的元素求和,每个元素都有不同的索引

递归地对列表的元素求和