是否可以创建一个不使用数组就可以接受3个整数并输出奇/偶整数的程序?

时间:2019-08-21 05:23:51

标签: c

我们的老师在C语言中进行了一次练习。我们必须创建一个程序,该程序接受三个整数,如果它们是奇数或什至不使用数组,则将其输出,只能使用循环和条件语句。 我只允许使用scanf(),printf(),循环和条件语句。我一定不能有多个变量,例如,奇数1,奇数2,奇数3,偶数1,偶数2,偶数3。而且我不能做scanf(“%d%d%d”,),所以我必须运行scanf(“%d”)3次我想不出任何能精确打印出预期输出相同格式的想法。我希望有人可以帮助我

#include <stdio.h>

int main() {

    int i, num;

    printf("Enter three integers: ");

    for(i=1;i<=3;i++)
    {
        scanf("%d", &num);

          if(!(num%2))
          {
            printf("\nEven: %d", num);    
          }
          if(num%2)
          {
            printf("\nOdd: %d\n", num);    
          }
    }
}

我希望这样的事情……

输入:

   1 2 3

输出:

   Odd: 1 3
   Even: 2

输入:

   2 4 6

输出:

   Odd:  
   Even: 2 4 6

...但是我唯一能做的就是这个

输入:

   1 2 3

输出:

    Odd: 1
   Even: 2
    Odd: 3

输入:

    1 3 5

输出:

    Odd: 1
    Odd: 3
    Odd: 5

4 个答案:

答案 0 :(得分:4)

为了获胜而进行递归(变相循环)(如果您不介意将偶数取反)。

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

void separate(int m, int n) {
    if (m == n) printf("Odd:");
    if (n == 0) { printf("\nEven:"); return; }
    int i;
    if (scanf("%d", &i) != 1) exit(EXIT_FAILURE);

    // print odd numbers before recursing; even numbers after recursing
    if (i % 2 == 1) printf(" %d", i);
    separate(m, n - 1);
    if (i % 2 == 0) printf(" %d", i);

    if (m == n) printf("\n\n");
}

请参见https://ideone.com/GpE7rC,其中包括调用和输入

separate(3, 3); // for 3 numbers

答案 1 :(得分:0)

一种说法是

int odd1, odd2, odd3, numOdd = 0; 

/* Code as above */

scanf("%d", &num);

if (num%2)
{
    if (numOdd == 0)
    {
        odd1 = num;
        numOdd++;
    }
    else if (numOdd == 1)
    {
        odd2 = num;
        numOdd++;
    }
    /* And continue */
}
else
{
    /* Repeat with even1, even2, even3 and numEven */
}

/* Print out numOdd oddn's */
/* Print out numEven evenn's */

这似乎是愚蠢的练习,但是至少您会得到很多练习来编写if语句...


我还认为:

scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &num3);

可能更短,但是除非您需要执行以下操作,否则您不需要for循环:

printf("Odd: ");
for (i = 0; i < 3; i++)
{
    int thisNum;
    if (i == 0) thisNum = num1;
    else if (i == 1) thisNum = num2;
    /* etc */
    if (thisNum % 2) printf("%d ", thisNum);
}

答案 2 :(得分:0)

问题在于您不能使用数组。因此,您不得使用字符串(即数组)。允许使用scanfprintf是您的老师故意设置的陷阱-在不求助于使用数组(显式或隐式)的情况下,无法以有用的方式使用它们。

因此,您必须执行以下操作:

#include <stdio.h>
#include <ctype.h>


void print_number(int n)
{
    if (n < 0) {
        putchar('-');
        n = -n;
    }

    if (n == 0)
        putchar('0');

    if (n / 10)
        print_number(n / 10);

    putchar(n % 10 + '0');
}

int main(void) {
    putchar('E');
    putchar('n');
    putchar('t');
    putchar('e');
    putchar('r');
    putchar(' ');
    putchar('t');
    putchar('h');
    putchar('r');
    putchar('e');
    putchar('e');
    putchar(' ');
    putchar('i');
    putchar('n');
    putchar('t');
    putchar('e');
    putchar('g');
    putchar('e');
    putchar('r');
    putchar('s');
    putchar(':');
    putchar(' ');
    fflush(stdout);

    int odd1, odd2, odd3, odd_count = 0;
    int even1, even2, even3, even_count = 0;
    for(int i = 0; i < 3; i++)
    {
        int number = 0;
        int c;
        while (1) {
            c = getchar();
            if (isspace(c)) {
                if (c == '\n')
                    break;

                while ((c = getchar()) == ' ');
                ungetc(c, stdin);
                break;
            }
            else if (isdigit(c)) {
                number = number * 10 + c - '0';
            }
        }
        if (number % 2) {
            switch (odd_count) {
                case 0: odd1 = number; break;
                case 1: odd2 = number; break;
                case 2: odd3 = number; break;
            }
            odd_count ++;
        }
        else {
            switch (even_count) {
                case 0: even1 = number; break;
                case 1: even2 = number; break;
                case 2: even3 = number; break;
            }
            even_count ++;
        }
    }

    putchar('O');
    putchar('d');
    putchar('d');
    putchar(':');
    putchar(' ');

    if (odd_count >= 1) {
        print_number(odd1);
    }

    if (odd_count >= 2) {
        putchar(' ');
        print_number(odd2);
    }

    if (odd_count >= 3) {
        putchar(' ');
        print_number(odd3);
    }

    putchar('\n');
    putchar('E');
    putchar('v');
    putchar('e');
    putchar('n');
    putchar(':');
    putchar(' ');

    if (even_count >= 1) {
        print_number(even1);
    }

    if (even_count >= 2) {
        putchar(' ');
        print_number(even2);
    }

    if (even_count >= 3) {
        putchar(' ');
        print_number(even3);
    }

    putchar('\n');
}

此代码不使用任何数组。

如果您不能定义任何函数(显然不是main),则必须在6个位置内联print_number,以将递归转换为迭代。祝你好运!

但是,如果教师在不允许使用数组的任务中接受字符串的使用,则可以将其视为无视它们设置的所有愚蠢限制的许可。

答案 3 :(得分:-3)

鉴于您正在学习C,也许您的老师想教您一些指针算法,而不是像下面的代码中那样使用数组:

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

int main()
{
  int i = 0;
  int *odd = (int*)malloc(3 * sizeof(int));
  int odd_count = 0;
  int *even = (int*)malloc(3 * sizeof(int));
  int even_count = 0;

  printf("Enter three integers: ");

  for(i=0; i<3; i++)
  {
    int num = 0;
    scanf("%d", &num);
    if(!(num%2))
    {
        *even++ = num;
        even_count++;
    }
    if(num%2)
    {
        *odd++ = num;
        odd_count++;
    }
  }

  even -= even_count;
  odd -= odd_count;

  printf("\nEven: ");
  for(i=0; i<even_count; i++)
  {
     printf("%d ", *even++);
  }

  printf("\nOdd: ");
  for(i=0; i<odd_count; i++)
  {
     printf("%d ", *odd++);
  }

  free(odd);
  free(even);
  return 0;
}