0

为什么我的程序不起作用?它应该从公式 1-(1/2)+(1/3)...+(1/999)-(1/1000)= 中添加数字

#include <stdio.h>
#include <math.h>
int main () {
 int i, j;
 float  suma;
 suma = 0.f;
 for (i=0; i<1000; i++) {
    if (i%2==0) {
        suma=suma - 1/i;
    } else {
        suma=suma + 1/i;
    }
 }
 printf("%f", suma);

}
4

5 回答 5

7

除以零!!

int main () {
 int i;
 float  suma;
 suma = 0.0f; 
 for (i=1; i<1000; i++) {  //fix loop, start from 1
    if (i%2==0) {
        suma=suma - 1.0f/i; // Use 1.0, (1/i will be evaluated as int)
    } else {
        suma=suma + 1.0f/i;
    }
 }
 printf("%f", suma);

}
于 2013-08-13T09:26:49.383 回答
5

尝试1 / i使用. i_ int这将始终返回 0,除非iis 1。发生这种情况是因为1 / i被评估为欧几里得除法,其余部分被丢弃。

之所以这样评估,是因为1i都是整数。您需要将分子或分母设为浮点类型。

一种方法是转换i为浮点数,因此您的代码将如下所示suma = suma - 1 / (float)i:另一种方法是设为1浮点类型:suma = suma - 1.0 / isuma = suma - (float)1 / i.

于 2013-08-13T09:25:55.470 回答
1

如果您先应用一些数学,您将获得更高的准确性。你的系列:

1 - 1/2 + 1/3 - 1/4 + ... + 1/999 - 1/1000

可以改写为:

(1 - 1/2) + (1/3 - 1/4) + ... + (1/999 - 1/1000)

或作为:

1/(1*2) + 1/(3*4) + ... + 1/(999*1000) 

现在,您可以编写一个程序来执行计算。但是,您应该使用doubletype 来提高准确性并将 integer 转换为 double 以确保将您的系列添加为 double 数字:

#include <stdio.h>
#include <math.h>
int main() {
    int i;
    double sum = 0;
    for (i=1; i<1000; i+=2) {
        sum += 1/(i*(i+1.)); // 1. to force cast to double
    }
    printf("%g", sum);
}
于 2013-08-13T10:40:30.140 回答
1

for 循环从 0 开始。因此第一次迭代返回除以零错误。第二次迭代将返回 1/1=1 并且效果很好,但是从第三次迭代开始它将返回 0,因为您使用的是 int。尝试从 1 开始 for 循环并将 i 类型转换为浮动。

于 2013-08-13T10:21:47.450 回答
0

这里有一个简单的程序

float j = 1.0f;
float suma = 0.0f;
int i = 1;

for (i=1; i <= 1000; i++) {
   suma += j/i;
   j = j * (-1);
}
于 2013-08-13T10:00:18.663 回答