C-1/n个数之和

C-1/n个数之和,c,numbers,sum,C,Numbers,Sum,您好,请您快速浏览一下我的代码并指出错误。 我试图计算n个数的和,像这样:1-1/2+1/3-1/4。。。等等 使用下面的代码,我每次得到1.00000,但它应该在0和1之间,例如对于3,它应该是1-1/2+1/3=083333 #include <stdio.h> int main () { int n, prefix; float sum; scanf("%d", &n); do { if (n%2==0) { prefix=-1; } el

您好,请您快速浏览一下我的代码并指出错误。 我试图计算n个数的和,像这样:1-1/2+1/3-1/4。。。等等

使用下面的代码,我每次得到1.00000,但它应该在0和1之间,例如对于3,它应该是1-1/2+1/3=083333

#include <stdio.h>
int main () {

 int n, prefix;
 float sum;
 scanf("%d", &n);
 do {
   if (n%2==0) {
    prefix=-1;
   } else {
    prefix=1;
   }
   sum+=  prefix/n;
   n = n - 1;

 } while (n > 0);
 printf("%f", sum);

}
#包括
int main(){
int n,前缀;
浮点数;
scanf(“%d”和“&n”);
做{
如果(n%2==0){
前缀=-1;
}否则{
前缀=1;
}
总和+=前缀/n;
n=n-1;
}而(n>0);
printf(“%f”,总和);
}

前缀
n
都是整数,这意味着您将使用整数除法来截断结果(即简单的小数切割)。如果需要浮点结果,则其中一个或两个变量也必须是浮点变量。

前缀和
n
都是整数,这意味着您将使用整数除法来截断结果(即简单地削减小数)。如果需要浮点结果,则其中一个或两个变量也必须是浮点变量。

当两个变量都是整数时,您正在执行
前缀/n
。所以你得到的答案是整数(总是0)

使用

甚至

(double)prefix/(double)n
以下是完整的代码:

#include <stdio.h>
int main () {

 int n, prefix;
 float sum = 0;
 scanf("%d", &n);
 do {
   if (n%2==0) {
    prefix=-1;
   } else {
    prefix=1;
   }
   sum+= (double)prefix/(double)n;
   n = n - 1;

 } while (n > 0);
 printf("%f", sum);

}
#包括
int main(){
int n,前缀;
浮点数和=0;
scanf(“%d”和“&n”);
做{
如果(n%2==0){
前缀=-1;
}否则{
前缀=1;
}
和+=(双)前缀/(双)n;
n=n-1;
}而(n>0);
printf(“%f”,总和);
}
我在compileonline.com上运行了它,输入值为10,得到:


当两者都是整数时,您正在执行
前缀/n
。所以你得到的答案是整数(总是0)

使用

甚至

(double)prefix/(double)n
以下是完整的代码:

#include <stdio.h>
int main () {

 int n, prefix;
 float sum = 0;
 scanf("%d", &n);
 do {
   if (n%2==0) {
    prefix=-1;
   } else {
    prefix=1;
   }
   sum+= (double)prefix/(double)n;
   n = n - 1;

 } while (n > 0);
 printf("%f", sum);

}
#包括
int main(){
int n,前缀;
浮点数和=0;
scanf(“%d”和“&n”);
做{
如果(n%2==0){
前缀=-1;
}否则{
前缀=1;
}
和+=(双)前缀/(双)n;
n=n-1;
}而(n>0);
printf(“%f”,总和);
}
我在compileonline.com上运行了它,输入值为10,得到:


我可以看到三个错误:

  • 打字错误(
    premix
    vs
    prefix
  • 整数类型的使用
  • (感谢@Light)
    sum的初始化
  • 请尝试以下操作:

    #include <stdio.h>
    int main () {
    
     int n, n_initial;
     double sum=0.0, prefix = 1.0;
     printf("enter the value for n:\n");
     scanf("%d", &n);
    
     if(n<1) {
       printf("n must be > 0!\n");
       return 1;
     }
     n_initial = n;
     if (n%2==0) prefix = -1.0; else prefix= 1.0;
     do {
       sum+= prefix/(double)n;
       prefix *= -1.0;
       n--;
    
     } while (n > 0);
     printf("The sum of the series over %d terms is: %lf\n", n_initial, sum);
     return 0;
    }
    
    #包括
    int main(){
    int n,n_首字母;
    双和=0.0,前缀=1.0;
    printf(“输入n:\n的值”);
    scanf(“%d”和“&n”);
    if(n0);
    printf(“超过%d项的系列总和为:%lf\n”,n_首字母,总和);
    返回0;
    }
    
    注意-我将
    n
    保留为一个整数,并在除法之前显式转换它。将其设置为float/double可能更好—记住相应地更改
    scanf
    的格式规范。我只做一次模运算(之后,
    prefix
    的符号一直在变化)。此外,最好添加一个数字输入提示(“为什么它什么都不做?!”),对结果进行注释(而不是打印“只是一个数字”),并以换行符结束输出(这样提示不会掩盖程序的输出)

    最后,您可能需要检查用户是否输入了负数,这将使您的代码产生错误的结果


    事后考虑-您可以测试
    n
    的大值,然后返回
    log(2.0)
    。但那将是欺骗。。。这个数列收敛得非常慢(它振荡得非常厉害——当n=1000时,第三位数字仍然在变化)。因此,四舍五入错误的风险实际上是复合的。这就是为什么需要使用
    double
    类型;但是我建议,看看计算
    log(2.0)
    的其他方法是很有启发性的——例如,使用在中给出的其他系列之一。实际上,您可以实现所有这些,并在n个术语之后比较它们的精度(通过打印错误:
    sum-log(2.0)

    我可以看到三个错误:

  • 打字错误(
    premix
    vs
    prefix
  • 整数类型的使用
  • (感谢@Light)
    sum的初始化
  • 请尝试以下操作:

    #include <stdio.h>
    int main () {
    
     int n, n_initial;
     double sum=0.0, prefix = 1.0;
     printf("enter the value for n:\n");
     scanf("%d", &n);
    
     if(n<1) {
       printf("n must be > 0!\n");
       return 1;
     }
     n_initial = n;
     if (n%2==0) prefix = -1.0; else prefix= 1.0;
     do {
       sum+= prefix/(double)n;
       prefix *= -1.0;
       n--;
    
     } while (n > 0);
     printf("The sum of the series over %d terms is: %lf\n", n_initial, sum);
     return 0;
    }
    
    #包括
    int main(){
    int n,n_首字母;
    双和=0.0,前缀=1.0;
    printf(“输入n:\n的值”);
    scanf(“%d”和“&n”);
    if(n0);
    printf(“超过%d项的系列总和为:%lf\n”,n_首字母,总和);
    返回0;
    }
    
    注意-我将
    n
    保留为一个整数,并在除法之前显式转换它。将其设置为float/double可能更好—记住相应地更改
    scanf
    的格式规范。我只做一次模运算(之后,
    prefix
    的符号一直在变化)。此外,最好添加一个数字输入提示(“为什么它什么都不做?!”),对结果进行注释(而不是打印“只是一个数字”),并以换行符结束输出(这样提示不会掩盖程序的输出)

    最后,您可能需要检查用户是否输入了负数,这将使您的代码产生错误的结果


    事后考虑-您可以测试
    n
    的大值,然后返回
    log(2.0)
    。但那将是欺骗。。。这个数列收敛得非常慢(它振荡得非常厉害——当n=1000时,第三位数字仍然在变化)。因此,四舍五入错误的风险实际上是复合的。这就是为什么需要使用
    double
    类型;但是我建议,看看计算
    log(2.0)
    的其他方法是很有启发性的——例如,使用在中给出的其他系列之一。实际上,您可以实现所有这些,并在n个术语之后比较它们的准确性(通过打印错误:
    sum-log(2.0)

    将您未初始化的sum添加到上述答案中(将其初始化为