如何打印所有奇数?

时间:2017-07-21 18:35:06

标签: c

我想使用无限循环,中断和继续打印从14到156的所有奇数。但是,当我运行它时,它不显示任何东西!!

int main()
{
    int x;
    int y = 14;
    while(x) {
        if(y % 2 == 0) {
            continue;
        }
        else if(y % 3 == 0) {
            printf("%d\n", y);
        }
        if(y == 156) {
            break;
        }
        y++;
    }
    return 0;
}

6 个答案:

答案 0 :(得分:2)

您的代码存在的问题是它使用的操作具有不可预测的结果。具体来说,声明int x;而不初始化它,然后将其用作while(x)中的终止条件是问题所在。在许多平台和编译器上,这将保留x占用的内存中已有的任何值。在这种情况下,您可能看不到打印语句,因为x以零值开头,循环从不运行。

你应该让你的循环进入无限循环:

int main()
{
    int x;
    for(x = 14; ; x++) {
        if(x % 2 == 0) {
            continue;
        }
        if(x >= 156) {
            break;
        }
        printf("%d\n", x);
    }
    return 0;
}

[IDEOne link]

这将打印除156之外的值。要包含156,请在break调用之后添加printf条件:

printf("%d\n", x);
if(x >= 156) {
    break;
}

或者,您可以将>=更改为>

如果您有elsebreak,则不需要continue

如果你必须使用while循环,情况会有点复杂,因为你必须在continue之前增加以避免无限循环:

int main() {
    int x = 14;
    while(1) {
        if(x % 2 == 0) {
            x++;
            continue;
        }
        if(x >= 156) {
            break;
        }
        printf("%d\n", x++);
    }
    return 0;
}

[IDEOne Link]

如果你可以放弃continue

,你可以避免额外的增量
int main() {
    int x = 14;
    while(1) {
        if(x % 2) {
            printf("%d\n", x);
        }
        if(x++ == 156) {
            break;
        }
    }
    return 0;
}

[IDEOne Link]

我还删除了对x % 3 == 0的支票,因为目前还不清楚问题的目的是什么。

答案 1 :(得分:1)

无限循环:

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

int main() {

int y=14;
while(1){
    if(y & 1){
        printf("%d\n",y);
    }

    if(y>=156){
        break;
    }

    y++;
}

return 0;
}

带有for循环的优先方法:

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

int main() {

int start=14;
start |= 1; //This will increment by one if your start value is even
for (start; start<=146; start+=2) {
    printf("%d\n", start);  
}

return 0;
}

答案 2 :(得分:0)

带有中断的无限循环不是正确的方法。使用“for”循环,您的代码将更加清晰。从15开始,然后递增2到156。

答案 3 :(得分:0)

你的逻辑有几个问题。

1. Variable `x` is of no use. You can use variable `y` to terminate the loop.
2. No need to check if the number is a multiple of 3.
3. No need to check for even numbers is either.

我修改了代码并提供了正确的结果,但我恳请您阅读以上几点并尝试正确使用代码。

int main()
{
    int y = 14;
    while(y) {
        if (y==156)
            break;
        if(y % 2 != 0) {
            printf("%d ",y);
        }
        y++;
    }
    return 0;
}

更好更快的方法是从15开始,将变量y的值增加2,直到<&lt; = 156。

int main()
    {
        int y = 15;
        while(y) {
            if (y==157)
                break;
            printf("%d ",y);
            y+=2;
        }
        return 0;
    }

答案 4 :(得分:0)

您的代码具有未定义的行为,因为变量x未初始化并用作while语句中的条件。您可以使用while (1)解决此问题,但程序中确实存在无限循环,因为均衡度测试发生在156上的终止测试之前。

只需使用标准for循环即可解决问题:

#include <stdio.h>

int main(void) {
    for (int y = 14; y < 156; y++) {
        if (y % 2 != 0) {
            printf("%d\n", y);
        }
    }
    return 0;
}

可以简化为这个,只列举奇数:

#include <stdio.h>

int main(void) {
    for (int y = 15; y < 156; y += 2) {
        printf("%d\n", y);
    }
    return 0;
}

如果您需要使用breakcontinue无限循环,您确实可以使用经典的永远C循环,for循环终止条件:

#include <stdio.h>

int main(void) {
    for (int y = 14;; y++) {
        if (y == 156)
            break;
        if (y % 2 == 0)
            continue;
        printf("%d\n", y);
    }
    return 0;
}

答案 5 :(得分:0)

嗯......

#include <stdio.h>
#include <stdint.h>
#include <errno.h>

/* Prints even or add numbers between to and from.
   Works for negative numbers.
   Works up and down.
 */
int print_even_or_odd(long long from, long long to, int even)
{
  if (((INT32_MAX < from) || (INT32_MIN > from)) ||
      ((INT32_MAX < to) || (INT32_MIN > to)))
  {
    fprintf(stderr, "Invalid input.\n");
    errno = EINVAL;
    return -1;
  }

  printf("from=%d to %d\n", (int) from, (int) to);

  int sign = (to < from) ?-1 :1;

  /* Adjust "from" to next even/odd number. */
  if ((!even && !(from & 1)) || (even && (from & 1)))
  {
     from += sign;
  }

  /* Adjust "to" to the previous even/odd number. */
  if ((!even && !(to & 1)) || (even && (to & 1)))
  {
    to -= sign;
  }

  {
    size_t steps = (size_t) (sign * ((to - from) / 2)) + 1;

    if (0 == steps)
    {
      printf("Nothing to do.\n");
      return 0;
    }

    while (1)
    {
      if (0 >= steps)
      {
        break;
      }

      --steps;

      printf("%d\n", (int) (to - sign * 2 * (int) steps));

      continue; /* as having continue is a requirement ... ;-) */
    }
  }

  return 0;
}

int main(void)
{
  print_even(14, 156, 0);
  print_even(156, 14, 0);
  print_even(-14, -156, 0);
  print_even(-156, -14, 0);
}