2016-11-16 57 views
-5

我需要創建程序,在輸出中我會得到第n個數字或序列。順序看起來像這樣:序列號

(-10,5,-2.5,1.25,-0.625 ...)

#include <iostream> 

using namespace std; 

double count (double n) 
{ 
    if (n==1) 
     return -10; 
    else 
     return (-10/((n-1)*(-2))); 
} 

double n; 

main() 
{ 
cout<<"n? : "; 
cin>>n; 
cout<<count(n); 
return 0; 
} 

對我來說everythink看起來不錯對我來說,當我給程序1,它給出-10,當我給出2時,它給出5,但在3上它給出2.5,而不是-2.5,在4上它給出1.(6),這對我沒有意義。這段代碼中的錯誤在哪裏?

+2

使用正確的工具來解決這樣的問題是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

爲什麼不將計算分解成單獨的步驟而不是將所有內容都粘在一行上?每當你得到一個沒有意義的計算時,最好的辦法是分解它,看看哪部分計算沒有返回正確的值。 – PaulMcKenzie

+0

不要使用'double'值進行精確比較,如:'if(n == 1)' –

回答

1

你的問題的一個有效的(優化的代碼),代碼如下:

#include <iostream> 
#include<math.h> 
using namespace std; 

double count (double n) 
{ 
    double x = pow(2, n - 1);  //calculate the divisor 
    return pow(-1, n) * (10/x); // divide 10 with divisor followed by assigning it a sign 
} 

int main() 
{ 
    int n; 
    cout<<"n? : "; 
    cin>>n ; 
    cout<<count(n) << endl; 
    return 0; 
} 

注:冗餘的發生是由於在你的代碼分支。儘可能編寫直線代碼(沒有太多分支)。

+0

您沒有得到正確答案的原因是因爲這些值採用了在您的公式中沒有考慮到的備選符號。 – eshb

0

當你給n=3,(-10/((n-1)*(-2)))給你(-10/((3-1)*(-2))) = 2.5。我的建議將返回(10/((n-1)*2)) * sign(n),其中sign(n)如果n是偶數返回1,否則返回-1。

0

我認爲你的問題有一個非常好的&容易遞歸解決方案:

double count(int n){ 
    if (n <= 1) return -10; 
    return count(n - 1)*-0.5; 
} 

調用示例:

#include <iostream> 
#include <iomanip> 

int main(){ 
    for (int i = 1; i < 20; ++i){ 
     std::cout << std::setw(15) << count(i) << std::endl; 
    } 

    return 0; 
} 

輸出:

  -10 
       5 
      -2.5 
      1.25 
     -0.625 
     0.3125 
     -0.15625 
     0.078125 
    -0.0390625 
     0.0195313 
    -0.00976563 
    0.00488281 
    -0.00244141 
     0.0012207 
    -0.000610352 
    0.000305176 
    -0.000152588 
    7.62939e-005 
    -3.8147e-005