【问题标题】:Is it possible to create a program that accepts 3 integers and outputs the odd/even integers without using array?是否可以创建一个接受 3 个整数并在不使用数组的情况下输出奇数/偶数整数的程序?
【发布时间】:2019-08-21 05:23:51
【问题描述】:

我们的老师给了我们一个 C 的练习。我们必须创建一个程序,它接受三个整数并输出它们,如果它们是奇数或偶数,则不使用数组,只能使用循环和条件语句。 我只能使用 scanf()、printf()、循环和条件语句。我不能有多个变量,比如odd1、odd2、odd3、even1、even2、even3。而且我不能做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

【问题讨论】:

  • @KenY-N ,我也是这样做的,先生。但是老师不接受那个代码。对我来说,这似乎是不可能的。
  • 运行循环两次。先选奇数再选偶数。
  • 我认为写入字符串会作弊,因为它们是字符数组。
  • 告诉你的老师,教你数组比没有数组更有意义。
  • 你的程序使用 4 个数组(字符)。

标签: c


【解决方案1】:

递归(变相循环)获胜(如果您不介意将偶数反转)。

#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

【讨论】:

  • 我希望它会在扫描所有 3 个数字之前打印“odd:”
  • 这是一个简单的改变,@AjithCNarayanan。我的答案的核心是在递归调用 beforeafter 打印数字。玩得开心! 我只是想把它全部塞进一个函数中,将功能从递归函数中移出让它更简单:)
  • 我认为这是满足要求的唯一答案,尽管我想知道它是否对OP来说太高级了。我很想看看老师的答案是什么。
  • 它仍然使用数组。
  • @AnttiHaapala:没有数组版本,递归函数简化为ideone.com/6ik1XB
【解决方案2】:

一种方法是:

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

【讨论】:

  • 根据 OPs 的问题,不能使用多个变量。请参阅:我不能有多个变量,例如奇数 1、奇数 2、奇数 3、偶数 1、偶数 2、偶数 3。
【解决方案3】:

问题是你不能使用数组。因此,您不能使用字符串,它们是数组。允许使用 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,将递归变为迭代。祝你好运!

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

【讨论】:

  • 根据 OPs 的问题,不能使用多个变量。请参阅:我不能有多个变量,例如奇数 1、奇数 2、奇数 3、偶数 1、偶数 2、偶数 3。
  • 你应该转换is*()函数的参数:isdigit((unsigned char)c) :)
  • 哈哈,但我不需要 :)) 这是一个陷阱
【解决方案4】:

鉴于您正在学习 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;
}

【讨论】:

  • 嗯,它仍在使用数组,只是动态分配的。而3 不是malloc 的正确论点
  • 没有必要在 C 中强制转换 malloc()。此外,您将错误的指针传递给 free()
  • 对不起,先生。但我们不允许使用指针或 malloc 函数
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多