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();
}
4

4 に答える 4

7

あなたはisDigit機能を誤解しています。

isDigitASCII文字コードを受け取り、10進数を表す場合はtrueを返します。

doubleによって返されるsqrtが整数であるかどうかを確認する必要があります。

于 2010-07-15T15:55:19.407 に答える
3

の使用には明らかなエラーがありますisdigit()。その関数(通常はマクロ)は、文字が文字の1つであるかどうかを判断するために使用されます0..-9確かに、コードは一貫して数値を処理しており、文字チェックの必要はありません。

達成しようとしていることを詳しく調べたいと思うでしょう。どのC関数が適しているかをお問い合わせください。


編集:

ああ、あなたはそのファンキーな式が整数値であるかどうか知りたいです。残念ながら、そのための組み込み関数はありません。私はこれをテストしていませんが、私は書きます

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

...ここで、は、指定された引数に最も近い整数値をrint()返す関数です。double

于 2010-07-15T15:56:02.703 に答える
1

なぜ使っているのisdigit?sqrtの結果は次のとおりですdouble。その値を直接確認する必要があります。

于 2010-07-15T15:57:39.840 に答える
0

5 * num * num + 4または5 * num * num - 4が完全な正方形であるかどうかを確認します。これを行う関数は次のとおりです。

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

    return (sqroot * sqroot) == d;
}

注-これは、浮動小数点数が等しいかどうかを決して比較してはならないという概念の良い反証です。この場合、「完全な正方形」は整数でなければならないため、問題ありません。

于 2010-07-16T05:12:03.453 に答える