[英]C - Sum of 1/n numbers
您好,您可以快速瀏覽一下我的代碼並指出錯誤。 我正在嘗試計算這樣的n個數字的總和:1- 1/2 + 1/3-1/4 ...等等...
使用以下代碼,我每次得到1.00000,但是它應該在0和1之間,例如對於3,它應該是1-1/2 + 1/3 = 0,83333。
#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);
}
我可以看到三個錯誤:
premix
vs prefix
) 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;
}
注意-我將n
保留為整數,並在除法之前將其顯式轉換。 最好將其設置為float / double-記住相應地更改scanf
的格式規范。 我只執行一次模運算(此后, prefix
的符號不斷變化)。 另外-總是建議輸入數字(“為什么不做任何事情?!”),注釋結果(而不是打印“僅數字”),並結束輸入,這總是一個好主意。用換行符輸出(因此提示不會混淆程序的輸出)。
最后-您可能要檢查用戶是否未輸入負數,否則將使您的代碼給出不好的結果。
事后考慮-您可以測試n
大值,然后返回log(2.0)
。 但是,這將是在欺騙......而這一系列不收斂非常慢(它振盪相當糟糕-的第三個數字還在不斷變化,當n = 1000)。 因此,四舍五入的錯誤確實有增加風險的風險。 這就是為什么您需要使用double
類型的原因。 但我建議您考慮一下其他計算log(2.0)
,例如,使用http://www.math.com/tables/expansion/log.htm上提供的其他系列之一。 您實際上可以實現所有這些函數,並在n個條件后比較它們的精度(通過打印錯誤: sum - log(2.0)
。
在上面的答案中加上未初始化的總和 (將其初始化為零 )。並且我認為您的代碼在輸入為0時不起作用(它給出除以零的誤差) 。因此,最好在while或for循環中使用或提出一個在做一會兒。
當兩者都是整數時,您正在做prefix/n
。 所以您得到的答案是整數(始終為0)
采用
(double)prefix/n
要么
prefix/(double)n
甚至
(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);
}
我在compileonline.com上以10的輸入運行它,並得到:
prefix
和n
都是整數,因此這意味着您將得到整數除法,該結果將被截斷(即簡單地切掉小數點)。 如果要浮點結果,則一個或兩個變量也必須是浮點變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.