c while while循环在条件之前停止

时间:2012-03-04 10:29:44

标签: c

我有一个练习,我必须计算斐波纳契数,直到100,然后打印出来。

我已经制作了这段代码:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {

        int i=2,fibonacci = 0, fParcialone = 1, fParcialtwo = 0;
        printf("The %2dst Fibonacci number is %3d\n", i-1, fibonacci+1);
        while (fibonacci <= 100){

            fibonacci = fParcialone+fParcialtwo;
            printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
            fParcialtwo = fParcialone;
            fParcialone = fibonacci;
            i++;
        }
        return 0;
    }

正如你所看到的,它打印出第12个数字,这个数字大于100.我明白为什么会这样做。

另一种方法是:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {

        int i=2,fibonacci = 0, fParcialone = 1, fParcialtwo = 0;
        printf("The %2dst Fibonacci number is %3d\n", i-1, fibonacci+1);
        while (fibonacci <= 100){

            fibonacci = fParcialone+fParcialtwo;
            if (fibonacci > 100){
                return 0;
            }
            printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
            fParcialtwo = fParcialone;
            fParcialone = fibonacci;
            i++;
        }
        return 0;
    }

现在它可以工作但是现在,在每个循环中,它进行两次比较而不仅仅是一次,我相信这种方式使用了很多“处理器时间”(在这个例子中它很少但是规模更大)可能会有所作为。)

有更好的方法吗?

favolas

8 个答案:

答案 0 :(得分:2)

我认为你可以使用do ... while(cond)。它应该看起来像:

#include <stdio.h>
#include <stdlib.h>

int main()
{

    int i=2,fibonacci = 0, fParcialone = 1, fParcialtwo = 0;
    printf("The %2dst Fibonacci number is %3d\n", i-1, fibonacci+1);
    fibonacci = fParcialone+fParcialtwo;
    do {
        printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
        fParcialtwo = fParcialone;
        fParcialone = fibonacci;
        i++;
    } while ((fibonacci = fParcialone+fParcialtwo) <= 100);
    return 0;
}

答案 1 :(得分:1)

一个简单的if语句的处理时间可以忽略不计。

如果你坚持让代码更好看,一个选项就是用以下代码替换while条件:

while (fParcialone + fParcialtwo <= 100)

或将循环更改为do-while循环。

答案 2 :(得分:1)

最简单的解决方案是:

    ...
    while (1) {

        fibonacci = fParcialone+fParcialtwo;
        if (fibonacci > 100){
            return 0;
        }
        printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
        fParcialtwo = fParcialone;
        fParcialone = fibonacci;
        i++;
    }
    ...

答案 3 :(得分:1)

你可以计算循环外的第一个数字,每次在循环结束时计算它。像这样:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {

        int i=2,fibonacci = 0, fParcialone = 1, fParcialtwo = 0;
        printf("The %2dst Fibonacci number is %3d\n", i-1, fibonacci+1);

        fibonacci = fParcialone+fParcialtwo;
        while (fibonacci <= 100){

            printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
            fParcialtwo = fParcialone;
            fParcialone = fibonacci;
            i++;
            fibonacci = fParcialone+fParcialtwo;
        }
        return 0;
    }

答案 4 :(得分:1)

我的C生锈了几十年,所以我不会尝试有效的代码,但为了解决这个问题,你基本上需要在中间打破循环以取消测试。

while(true)
{
   calculate
   if (fib <= 100)
   {
       output
   }
   else
   {
       break; // Exit from the loop
   }
}

然而 - 事实上,额外的比较只是在性能方面不是问题。即使在规模上,与其他操作相比,命中率也应该非常小,所以在一般情况下你需要担心的事情要多得多。 (总会有特定的情况可能不是这样。)

答案 5 :(得分:1)

当然有。

当你遇到这样的事情时,如果你觉得你需要在这样的循环中放入一个条件,它可能会进入while语句中发生的条件检查,并且在你的内部条件之后的任何内容是什么应该在while循环的最开始。然后根据需要重新排列所有内容(如在圆圈上)并在循环之前根据需要添加初始化语句以启动它。

int main()
{

    int i=2,fibonacci = 0, fParcialone = 1, fParcialtwo = 0;
    printf("The %2dst Fibonacci number is %3d\n", i-1, fibonacci+1);
    //initialize
    fibonacci = fParcialone+fParcialtwo;
    while (fibonacci <= 100){
        printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
        fParcialtwo = fParcialone;
        fParcialone = fibonacci;
        fibonacci = fParcialone+fParcialtwo;
        i++;
    }
    return 0;
}

答案 6 :(得分:1)

如果您想保留代码的大部分结构,请尝试:

#include <stdio.h>
#include <stdlib.h>

int main()
{

    int i=1,fibonacci = 1, fParcialone = 1, fParcialtwo = 0;
    while (fibonacci <= 100){
        printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
        fibonacci = fParcialone+fParcialtwo;
        fParcialtwo = fParcialone;
        fParcialone = fibonacci;
        i++;
    }
    return 0;
}

答案 7 :(得分:1)

我们已经知道第一个Fibonacci数是1,所以你甚至不需要在条件语句之前计算它。我知道它与你的代码不同,只是有一些乐趣,但希望它能让我们了解这个想法。

#include <stdio.h>
#include <stdlib.h>

int Fibonacci(int n)
{
    if(n <= 1) return n;  
    return Fibonacci(n-2) + Fibonacci(n-1);
}

int main()
{
    int i = 1, fibonacci = 1;
    do 
    {
        printf("The %2dst Fibonacci number is %3d\n", i, fibonacci);
        fibonacci = Fibonacci(++i);
    } while (fibonacci <= 100);

    return 0;
};

关键是在这种情况下计算并检查第12个斐波纳契数,然后再将其打印到屏幕上。无论哪种方式,一个if-check将没有任何明显的处理时间,并且可以忽略不计。