【问题标题】:Something not working in this C code此 C 代码中的某些内容不起作用
【发布时间】:2013-10-27 13:27:48
【问题描述】:

我想解决这个问题,因为我比任何其他语言都更了解 JavaScript,所以我首先用 JavaScript 编写它,现在我正在尝试将它翻译成 C。

这是我的 JavaScript 代码

var SUM=0,RES=1,n=prompt('Enter n'),i=1,j=1;
for(var i=1;i<=n;i++){

  SUM = 0;

  for(var j=1;j<=i;j++){

    SUM = SUM+ i/(2*j);

  }
  RES = RES * SUM
}
console.log(RES)

认为这很好用。我把它翻译成C,结果是:

#include "stdio.h"

int main(void) 
{
   int n,i,j;
   float SUM=0,RES=1;
   printf("n equals to ");
   scanf("%d", &n); 

    for(i=1;i<=n;i++){
        SUM = 0;

        for(j=1;j<=i;j++){

            SUM = SUM + i/(2*j);

        }
        RES = RES * SUM;
    }
   return RES;
}

JavaScript 至少返回一个数字。 C代码总是返回0,问题出在哪里?

【问题讨论】:

  • 你如何检查返回码? echo $??
  • Javascript 不区分整数和浮点数,而 C 可以。您的 C 版本将整数除以整数,计算结果为floor(i/(2*j))。你应该使 i 或 j 加倍;将显式强制转换添加到 i 或 j,或者 - 最简单的方法 - 将 2 更改为 2.0
  • @CharlieBurns 是的,也打印 0
  • @CharlieBurns:那要证明什么? RES 是一个 float!
  • @KerrekSB 我几乎不认为将其表示为谐波数的函数是“封闭形式”

标签: javascript c for-loop sum


【解决方案1】:

被整数除法所欺骗(一个非常常见的问题)!如果您将一行更改为:

SUM = SUM + (float)i/(2*j);

原因是整数除法的结果是另一个整数。所以无论何时

i/2*j < 1 (for positive integers)

你的结果被截断为 0。在你的情况下,不等式总是正确的,所以你只是加了很多零。只需先将 i 转换为浮点数,然后除以得到双精度结果。

【讨论】:

  • 它总是返回一个整数
  • Enve,您尝试进行更改吗?我想你会发现它有效。即使最终结果是整数,您编写的代码仍然需要在此期间处理非整数。
【解决方案2】:

如 cmets 中所述,您在这一行中进行整数除法

 SUM = SUM + i/(2*j);

这将返回一个整数的结果(如使用 floor 函数)

您需要将 1/(2*j) 中的隐式变量转换为浮点数或双精度数。

整数/浮点数是浮点数,整数/整数将返回整数。

浮点数乘以整数是浮点数。

SUM = SUM + i/(2.0f*j); 

应该通过将分母转换为浮点数来解决您的问题,

【讨论】:

  • 确实如此,但请考虑在此处更改措辞:“您需要转换 result..”——转换结果为时已晚。正如您进一步展示的那样,至少有一个参数需要是浮点数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多