使用java计算float数组中递增数字的总和

时间:2012-01-21 21:47:37

标签: java floating-point sum

我应该编写一个Java程序来总结以下序列:1.0 / 1.0 + 1.0 / 2.0 + 1.0 / 3.0 .... + 1.0 / 15,000,000.0按升序排列然后再按降序从1.0 / 15,000,000.0开始+ 1.0 / 14,999,999使用32位浮点一直下降到1.0 / 1.0。我正在努力弄清楚如何做到这一点,但这是我到目前为止(不知道它是否会起作用):

编辑:很抱歉打开这个东西,但我得到的答案都是1.0,我很确定这是不正确的。有谁知道我做错了什么?

public class FloatSum {

public static float increasingSum (float numbers1){
float sum1 = 0;
for (int i = 1; i <= 15000000; i++){ 
    sum1 = sum1 + 1/i; 
    } 
return sum1;
} 

public static float decreasingSum (float numbers2){
float sum2 = 0;
for (int i = 15000000; i >= 1; i--){ 
    sum2 = sum2 + 1/i; 
    } 
return sum2;
}

public static void main(String[] args) {
float sum1 = 0;
float sum2 = 0; 

System.out.println(increasingSum(sum1));
System.out.println(increasingSum(sum2));
}
}

4 个答案:

答案 0 :(得分:5)

由于这是作业,我将限制我的回答几个提示:

  1. 您不需要数组:单个标量累加器变量就足够了。将其初始化为零并将每个术语添加到其中。
  2. 不要循环使用和的项,循环遍历分母(非常方便的整数)。

答案 1 :(得分:2)

完全同意aix。 至于为什么你的代码没有编译:“a”变量是一个浮点数,但是你试图用它来访问一个数组(需要一个int),并且因为将一个浮点数作为一个int使用是非法的编译错误。您可以通过将float转换为int

来解决错误
numbers1[(int)a]

但这将毫无用处,因为该程序仍然是错误的:

  • 访问数组没有意义,因为所有元素都是0(你确实创建了一个数组,但所有元素只是初始化为0)
  • 由于for的测试条件为a < numbers1.length,因此在上一次迭代中,您将在代码ArrayOutOfBoundException中获得numbers1[a+1](您将尝试访问15000001个元素)

还有另一个问题,它不会使你的程序失败,但似乎暴露了对for循环如何工作的一些误解:具体来说,你在每次迭代时增加x变量,但是这是徒劳的,因为变量x仅用于初始化:a = 1/x部分在执行循环之前只执行一次。 这里有一个简短的for引物:

for( Initializer; TestExpr; CountExpr ){ Body }

执行循环的机器将执行以下操作:

  1. 执行Initializer代码
  2. 如果TestExpr评估为false,请转到6
  3. 执行Body代码
  4. 执行CountExpr代码
  5. 转到2
  6. 光洁度!
  7. 我可以给你的建议是尝试使用通常的数学结构来解决在纸上如何执行任务,然后将解决方案“移植”到java。

答案 2 :(得分:1)

for循环中的逻辑不正确。哈哈,我不太清楚你要告诉它做什么,但让我们看看我们是否可以通过它......

暂时忘掉剩下的代码,关注for循环的作用:

将float变量'a'初始化为1 / x。将结束值设置为数组的长度(良好)。然后你将变量'a'加1和'x'加1 ...

现在以这种方式考虑它,你将'a'初始化为1 / x,使其成为1.它以值a = 1运行循环。然后它将'x'递增1并将'a'递增1.现在认真思考,因为这是你的逻辑存在缺陷的地方。实际上这个DOES现在使x = 2,但你也是a = 2.'x'和'a'是自变量。重新阅读for循环的定义,看看你是否可以协调你想要做的事情。

现在,循环允许您进行迭代。在这种情况下,你有30,000,000(15,000,000“计数”和15,000,000“倒计时”)。所以让我们制作两个for循环,每个循环都有15,000,000次迭代

for (int i = 1; i <= 15000000; i++){
statements;
}

for (int i = 15000000; i >= 1; i--){
statements;
}

现在,你要总结1.0 / 1.0 + 1.0 / 2.0 + ... + 1.0 / 15,000,000.0。将sum1初始化为0:

float sum1 = 0; 

每次迭代你都会将1 / i添加到总和中。因此,每个for循环中的语句看起来像

sum1 += 1/i;

相同
sum1 = sum1 + 1/i;

你有它。对于第一个循环,每次迭代从i = 1开始加1 / i,结束于i = 15,000,000。对于第二个循环,它从i = 15,000,000开始添加1 / i并在i = 1处停止。显然,在您的情况下,您可以用'numbers1.length'替换15,000,000。然后返回sum1,你的所有错误就会消失。

注意:注意如何约束for循环。确保它包含结束值。 (注意两个循环中的&lt; = 15,000,000和&gt; = 1)这对您的代码没有太大影响,答案也会相同,但将来它会很重要。

答案 3 :(得分:0)

如果您愿意,请使用float,但请查看:Java:Why should we use BigDecimal instead of Double in the real world?

它被称为精度损失