我有一个练习,我必须计算斐波纳契数,直到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
答案 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将没有任何明显的处理时间,并且可以忽略不计。