2010-07-15 92 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