C - 数字之和

时间:2013-08-13 09:23:29

标签: c sum

为什么我的程序不能运作?它应该添加公式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);

}

5 个答案:

答案 0 :(得分: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);

}

答案 1 :(得分:5)

尝试打印1 / iiint。这将始终返回0,除非i1。发生这种情况是因为1 / i被评估为Euclidean division,其余部分被丢弃。

这样评估的原因是因为1i都是整数。 您需要分子或分母为浮点类型。

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

答案 2 :(得分:1)

for循环从0开始。 所以第一次迭代返回除以零的错误。 第二次迭代将返回1/1 = 1并且将正常工作,但是从第三次迭代它将返回0,因为您正在使用int。尝试从1开始for循环并将类型转换为浮动。

答案 3 :(得分: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) 

现在,您可以编写程序来执行计算。但是,您应该使用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);
}

答案 4 :(得分:0)

这里是一个简单的程序

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

for (i=1; i <= 1000; i++) {
   suma += j/i;
   j = j * (-1);
}