C 是否可以创建一个接受3个整数并在不使用数组的情况下输出奇偶整数的程序?
我们的老师给我们做了一个C语言的练习。我们必须创建一个程序,接受三个整数,如果它们是奇数或偶数,则在不使用数组的情况下输出它们,只能使用循环和条件语句。 我只允许使用scanf、printf、循环和条件语句。我不能有像odd1、odd2、odd3、even1、even2、even3这样的多个变量。而且我不能执行scanf%d%d,,因此我必须在一个循环中运行scanf%d三次。我想不出任何方法可以精确打印预期输出的相同格式。我希望有人能在这方面帮助我C 是否可以创建一个接受3个整数并在不使用数组的情况下输出奇偶整数的程序?,c,C,我们的老师给我们做了一个C语言的练习。我们必须创建一个程序,接受三个整数,如果它们是奇数或偶数,则在不使用数组的情况下输出它们,只能使用循环和条件语句。 我只允许使用scanf、printf、循环和条件语句。我不能有像odd1、odd2、odd3、even1、even2、even3这样的多个变量。而且我不能执行scanf%d%d,,因此我必须在一个循环中运行scanf%d三次。我想不出任何方法可以精确打印预期输出的相同格式。我希望有人能在这方面帮助我 #include <stdio.h&g
#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);
}
}
}
输出:
Odd: 1 3
Even: 2
Odd:
Even: 2 4 6
输入:
1 2 3
2 4 6
1 2 3
1 3 5
输出:
Odd: 1 3
Even: 2
Odd:
Even: 2 4 6
…但我唯一能做的就是
输入:
1 2 3
2 4 6
1 2 3
1 3 5
输出:
Odd: 1
Even: 2
Odd: 3
Odd: 1
Odd: 3
Odd: 5
输入:
1 2 3
2 4 6
1 2 3
1 3 5
输出:
Odd: 1
Even: 2
Odd: 3
Odd: 1
Odd: 3
Odd: 5
一种方法是:
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 */
这似乎是一个愚蠢的练习,但至少你会得到大量的练习,如果语句
我还想:
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);
}
鉴于您正在学习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;
}
如果你不介意把偶数颠倒过来的话,递归循环伪装成赢
#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");
}
问题在于不能使用数组。因此,不能使用字符串,它们是数组。允许使用scanf和printf是您的老师故意设置的陷阱-如果不使用数组,无论是显式的还是隐含的,都无法以有用的方式使用它们 因此,您必须这样做:
#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_编号,将递归更改为迭代。祝你好运
但是,如果老师接受在不允许使用数组的任务中使用字符串,您可以将其视为无视他们设置的所有愚蠢限制的许可。@KenY-N,这也是我所做的,先生。但是老师没有接受这个准则。对我来说,这似乎是不可能的。运行你的循环两次。首先选择奇数,然后选择偶数。我假设写入字符串是作弊,因为它们是字符数组。告诉你的老师,教你使用数组比不使用数组更有意义。你的程序使用4个字符数组。那仍然使用数组,只是动态分配的数组。3不是malloct的正确论点这里没有必要在C中使用malloc。而且,你把错误的指针传递给free。对不起,先生。“但是我们不允许使用指针或malloc函数,我希望它会打印奇数:在扫描所有3个数字之前,这是一个简单的改变,”AjithCNarayanan说。我的答案的核心是在递归调用之前或之后打印数字。玩得高兴我只是想把它全部塞进一个函数中,将函数从递归函数中移开使它更简单:我认为这是唯一满足要求的答案,尽管我不知道它对OP来说是否太高级。我很想看看老师想到的答案。它仍然使用数组。@AnttiHaapala:没有数组版本,递归函数根据OPs问题简化,不能使用多个变量。请看:我不能有像odd1,odd2,odd3,even1,even2,even3这样的多个变量。你应该使用is*函数的参数:isdigitunsigned charc:Haha,但我不需要:这是一个陷阱OPs问题,不能使用多个变量。请参阅:我不能有多个变量,如odd1、odd2、odd3、even1、even2、even3。