C-1/n个数之和
您好,请您快速浏览一下我的代码并指出错误。 我试图计算n个数的和,像这样:1-1/2+1/3-1/4。。。等等 使用下面的代码,我每次得到1.00000,但它应该在0和1之间,例如对于3,它应该是1-1/2+1/3=083333C-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
#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
vsprefix
)
整数类型的使用
(感谢@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
vsprefix
)
整数类型的使用
(感谢@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添加到上述答案中(将其初始化为)