【问题标题】:Why doesn't this loop work when an odd number is entered? [closed]为什么输入奇数时这个循环不起作用? [关闭]
【发布时间】:2020-07-09 15:52:06
【问题描述】:

当项数中输入奇数时,以下代码中的循环不起作用。

#include<stdio.h>

//fibonacci series with details...

int main() {

  int n, ter;
  int x1 = 1, x2, x3, x4;

  printf("Enter the number of terms:");
  scanf("%d", & ter);
  for (n = 0; n <= --ter; n++) {

    x1 += x2;
    x2 += x1;
    x3 = x1 + x2;
    printf("%d+%d=%d\n", x1, x2, x3);
    x4 = x2 + x3;

    printf("%d+%d=%d\n", x2, x3, x4);

  }

  printf("\nThx for trying :)");

  return 0;
}

当我为学期编号写 3 时,它写为 4 学期。我该如何解决?

【问题讨论】:

  • “循环不起作用”——您能说得更具体点吗?你能指望什么?你看到了什么?
  • 请修正您的缩进。此外,不需要您已经以文本形式提供的代码图片。
  • 如果删除=--会怎样?
  • 正如@MOehm 的评论所示,如果您的帖子格式不正确,那么人们就会错过相关信息。对于以后的帖子,请查看stackoverflow.com/editing-help
  • 问题是,不管你输入多少个词,按照你创建代码的逻辑,它总是会输出一个even number的词。这是因为,每个循环,for 循环都会打印两个术语。

标签: c for-loop fibonacci


【解决方案1】:
for(n=0;n<=--ter;n++){

这看起来非常可疑。您同时增加当前术语编号 减少终止点的事实通常意味着您接近结束条件的速度是应有的速度的两倍。想想当你想要第八个任期时会发生什么:n 从零开始,ter 从八开始,这些是循环:

n    ter    loop#
0    8      1
1    7      2
2    6      3
3    5      4
4    4      5

据我计算,这甚至还没有接近请求的八次迭代。但是,这不是您的偶数计数问题的原因是您实际进行计算的方式:

x1 += x2;
x2 += x1;
x3 = x1 + x2;

如果您检查它从 1, 1 的起点生成的内容,您会发现它实际上在每次迭代中将 x1x2 推进了 两个 步,而不是一个,所以一半迭代次数没问题。换句话说,它会:

 1,  1
 2,  3
 5,  8
13, 21 ...

而不是:

 1, 1
 1, 2
 2, 3
 3, 5
 5, 8 ...

但是,这仅适用于 偶数 个项,因为偶数除以 2,嗯,均匀 :-) 如果您有一个 奇数 个数,实际单步执行这些值似乎比必要的多一个,因为即使只需要一个,最终迭代仍将执行两个步骤。

更常用的方法(不受奇数影响的方法)是一次执行一个步骤,例如:

int x1 = 0, x2 = 1, x3 = 1; // or "1, 1, 2" depending on what
                            // you consider first term.

for (int n = 1; n < ter; n++) {
    printf ("%d + %d = %d\n", x1, x2, x3);
    x1 = x2;  // simply "shift" the values left ONE spot.
    x2 = x3;
    x3 = x1 + x2;
}
printf ("Requested term is %d\n", x1);

这显然比必要的循环多,但另一种方法是,只要剩下不到两步,您就必须停止循环,并在循环后检测是否需要执行最后一步(偶数计数为否,奇数计数为是)。

在我看来,这会使事情变得不必要地复杂化,所以我建议只使用每次迭代一步的方法,特别是因为在你的数字变得太大而无法处理之前不会有那么多步骤(假设非 bignum数据类型)。


顺便说一句,另一个问题是您在使用之前实际上并没有初始化x2。这可能行得通,但这纯粹是偶然的,而不是你应该依赖的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多