ФИБОНАЧЧИ!если ложь все время - PullRequest
1 голос
/ 15 июля 2010

Я создал программу, чтобы определить, принадлежит ли число к ряду Фибоначчи или нет, и делает ли он свою позицию. Каждый раз, когда я набираю число, условие 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 ]

7 голосов
/ 15 июля 2010

Вы неправильно понимаете функцию isDigit .

isDigit принимает код символа ASCII и возвращает значение true, если оно представляет десятичную цифру.

Выхотите проверить, является ли double, возвращаемое sqrt, целым числом.

3 голосов
/ 15 июля 2010

При использовании isdigit() существует очевидная ошибка. Эта функция (обычно макрос) используется для определения того, является ли символ одним из символов 0 .. 9 - конечно, ваш код работает с числами последовательно и нет необходимости проверять символы.

Вы захотите поближе взглянуть на то, что вы пытаетесь достичь. Вы можете спросить нас, какие функции C могут подойти.


EDIT:

Ах, вы хотите знать, является ли это забавное выражение целочисленным значением. Увы, для этого нет встроенной функции. Я не проверял это, но я бы написал

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

... где rint() - это функция, которая возвращает double, которое является ближайшим целочисленным значением к данному аргументу.

1 голос
/ 15 июля 2010

Почему вы используете isdigit?Результатом sqrt является double - вам нужно проверить это значение напрямую.

0 голосов
/ 16 июля 2010

Вы хотите проверить, является ли 5 * num * num + 4 или 5 * num * num - 4 идеальным квадратом. Функция, которая сделает это:

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

    return (sqroot * sqroot) == d;
}

Примечание. Это хорошее опровержение представления о том, что никогда не следует сравнивать числа с плавающей запятой на равенство. В этом случае это нормально, так как «идеальный квадрат» должен быть целым числом.

...