2010-07-15 87 views
1

我做了一個程序,以查找一個數字是否屬於斐波那契數列,如果它確實是它的位置。每當我輸入一個數字if條件出錯。斐波那契!如果一直都是假的

#include<stdio.h> 
#include<conio.h> 
#include<math.h> 
void main(void) 
{ 
    int i,x=1,y=1,z,num; 
    clrscr(); 
    printf("Enter a number to find in fibonacci series:"); 
    scanf("%d",&num); 
    /*to find if the number is a part of fibonacci series or not*/ 
    if((isdigit(sqrt(5*num*num+4)))||(isdigit(sqrt(5*num*num-4)))) //<-- this if! 
    {//belongs to fibo! 
     for(i=1; ;i++) 
     { 
      if(x==num) 
      break; 
      z=x+y; 
      x=y; 
      y=z; 
     } 
     printf("%d is the %d term of fibonacci series.",num,i); 
    } 
    else 
     printf("Dear user,The entered number is not a part of the fibonacci series."); 

    getch(); 
} 
+2

isdigit檢查給定的char是否是一個有效的ascii數字0-9。我不知道你在嘗試使用它。你也真的需要在你的for循環上設置一個上限。 – Lazarus 2010-07-15 15:56:21

+0

查看下面的評論 – 2010-07-15 16:01:41

+1

@Lazarus:迂腐:平方根(一旦固定)的魔術已經在檢查數字是否是斐波那契數。確定後,循環肯定會終止。雖然沒有防守編碼,但該程序在數學上聽起來很合理。 – 2010-07-15 16:04:09

回答

7

您誤解了isDigit function

isDigit需要一個ASCII字符代碼,如果代表十進制數字則返回true。

您想檢查sqrt返回的double是否爲整數。

+0

我測試了一個浮點數isdigit(),它的dint可以工作,所以我認爲如果數字的sqrt是一個浮點數,那麼它將返回0,我可以滿足我的需求 – 2010-07-15 15:57:43

+3

嗯,你錯了。要檢查一個數是否是一個整數,你可以編寫一個函數將它轉換爲'(int)'並檢查它是否等於原始值。 – SLaks 2010-07-15 15:58:26

+0

並非所有整數都可以表示爲浮點型 – kibibu 2010-07-16 05:34:13

3

使用isdigit()時出現明顯錯誤。該函數(通常是宏)用於判斷一個字符是否爲字符0 .. 9 - 當然,您的代碼一直處理數字,並且不需要進行字符檢查。

你會想仔細看看你想要完成什麼。歡迎您問我們哪些C函數可能適合。


編輯:

啊,你要知道這時髦的表達是一個整數值。唉,沒有內置的功能。我沒有測試過這一點,但我會寫

double a = (funky expr); 
if (a == rint(a)) ... 

...其中rint()是返回double這是最接近的整數值給定參數的函數。

+0

我如何發現如果數字是平方根是一個int還是一個浮點數? – 2010-07-15 16:03:27

+0

從'sqrt'返回的數字總是* double。返回值的數學屬性不會更改它返回的變量的數據類型。你需要問的問題是:「這個數字是浮點數double,等於一個整數,即它的小數部分0?」 – 2010-07-15 16:08:04

1

爲什麼使用isdigit? sqrt的結果是double - 您需要直接檢查該值。

0

你想檢查5 * num * num + 45 * num * num - 4是否是一個完美的正方形。這將做到這一點的函數是:

int is_perfect_sq(double d) 
{ 
    double sqroot = rint(sqrt(d)); 

    return (sqroot * sqroot) == d; 
} 

注意 - 這是你應該從未平等比較浮點數的概念的一個很好的反證。在這種情況下,這很好,因爲「完美正方形」必須是整數。

+0

嗯,如果有人比較花車,然後比較他們的地址將是一個很好的做法? – 2010-07-16 11:05:57