2012-03-04 173 views
0

我有一个练习,我必须计算斐波纳契数字直到100,然后打印它们。c while循环停止前条件

我有此代码:

#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

回答

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; 
} 
+0

这仍然会打印太多。 – interjay 2012-03-04 10:41:21

+0

糟糕,你是对的。我解决这个问题 – Coren 2012-03-04 10:42:30

1

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

如果你坚持让代码更好看的一个选项是简单地更换,而条件:

while (fParcialone + fParcialtwo <= 100) 

或改变循环到do-while循环。

+0

我已经尝试了while while循环,它也需要if语句。不知道这样做,而花了很少的处理时间,然后一段时间循环。谢谢 – Favolas 2012-03-04 10:41:34

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++; 
    } 
    ... 
+0

错误:'true'未声明(首次在此函数中使用) – Favolas 2012-03-04 10:40:02

+0

糟糕,这是纯粹的C ...使用'1'而不是'true'。 – 2012-03-04 10:40:56

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; 
    } 
1

我的C是一个几十年生疏,所以我不会尝试有效的代码,但要解决这个问题,你基本上需要在中间打出来的循环,去除测试。

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

但是 - 说实话,多出来的比较只是没有在性能方面的问题。即使在规模上,与其他业务相比,这一点也应该是微乎其微的,所以在一般情况下,您确实有更重要的事情需要担心。 (总是会有特定的情况,这可能不是真的。)

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; 
} 
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; 
} 
1

我们已经知道第一个斐波那契数为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都不会有明显的处理时间,而且可以忽略不计。