Tricky C程序找到偶数和奇数

时间:2011-12-18 06:43:47

标签: c

这是我在微软进行实习考试时遇到的一个具有挑战性的问题。问题是这样的:

  

用户输入十进制数字。输出应显示数字是偶数还是奇数受约束,只有一个printf,并且不能使用二元运算符,逻辑运算符,算术运算符if-elseswitch-case。< / p>

所有想法?

11 个答案:

答案 0 :(得分:45)

愚蠢的问题需要愚蠢的答案。

printf("Yes, the number is even or odd\n");

答案 1 :(得分:27)

这将有效:

printf("Number is odd? %d\n", (int)fmod((float)i, (float)2));

如果可以使用条件运算符,那就更好了:

printf("Number is %s\n", (int)fmod((float)i, (float)2) ? "odd" : "even");

答案 2 :(得分:9)

对于某些输入,Seth Carnegie的回答可能会失败。特别是在我的系统上,输入2147483647失败,表明它是偶数(至少在我的系统上),因为将该值转换为float会失去精度。

以下是基于他的改进解决方案:

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

int main(int argc, char **argv) {
    const char *const even_or_odd[] = { "even", "odd" };
    for (int i = 1; i < argc; i ++) {
        const int n = atoi(argv[i]);
        printf("%d is %s\n",
               n,
               even_or_odd[(int)fmod((unsigned char)n, 2.0)]);
    }
    return 0;
}

C99中for (int i = ...语法为“new”;如果您的编译器不支持它,请声明int i;在循环之上。

要测试的值取自命令行参数。修改程序很容易,因此它们来自stdin或其他地方。

atoi()函数没有错误检查,所以如果你给它一个不是十进制整数的东西,不要指望有意义的结果。

n的值转换为unsigned char,然后将其传递给fmod(),得到与n具有相同奇偶校验(奇数或偶数)的结果,但是转换为double时不会丢失精度(由于fmod()需要double个参数,因此隐式转换)。转换为无符号类型的标准定义语义使得即使在使用除二进制补码之外的表示的系统上也能正常工作。

unsigned char转换为double几乎不可能失去精确度。这将需要unsigned char具有难以置信的大上限。 double必须至少有10个十进制数字的精度,或大约33或34位;丢失精度要求unsigned char 至少 34位左右(这可能是我有一个错误或两个错误)。这样的系统可能符合要求,但我怀疑任何这样的系统都存在于现实世界中。

答案 3 :(得分:3)

我认为使用fmod接受的答案是打破“无算术运算符”规则。这是一个只使用结构和强制转换来找出最低有效位(表示奇数或偶数)的解决方案:

float f = ...;

struct intStruct {
    int i;
};
struct intStruct is;
is.i = (int)f;

struct bitField {
    unsigned int odd : 1;
    unsigned int padding: 15; // to round out to 16 bits
};
struct bitField *bf_ptr;
bf_ptr = (struct bitField *)&is;
struct bitField bf = *bf_ptr;

printf("Odd? %d", bf.odd);

答案 4 :(得分:2)

这是一个避免使用fmod的解决方案。它使用数字的字符表示,检查最后一位是否在{0,2,4,6,8}。

最大的麻烦就是找到最后一位数。

问题的限制是繁重的。

  1. 没有二元运算符:没有赋值(=)或数组索引([])或甚至结构引用(.
  2. 没有逻辑运算符:没有否定(!)或快捷技巧(&&)或相等(==
  3. 无算术运算符:无增量(++
  4. 没有ifswitch
  5. 只有一个printf
  6. 关于仅剩下的运营商有*&~?:sizeof

    大多数代码都试图找到字符串中的最后一位数字。使用的唯一二元运算符是main()驱动程序,以获取argv[1]。 (c[2]的方括号是声明语法,而不是运算符)

    我通过使用函数调用和memcpy来解决赋值问题。 我使用if来处理while并修改测试。 假设!=,我在NULL == 0左右工作。

    从好的方面来说,这个功能适用于非常大的数字!

    #include <string.h>
    #include <stdio.h>
    
    void* null_pointer;
    char c[2];
    
    // If s is not null, copy *s to *save, and change *s to '~'
    // Return s
    char* copy_zap_char_not_null(char* save, char* s) {
        char* p;
        memcpy(&p, &s, sizeof(char*));
        while (p) {
            memcpy(save, p, sizeof(char));
            memcpy(p, "~", sizeof(char));
            memcpy(&p, &null_pointer, sizeof(void*));
        }
        return s;
    }
    
    int print_even_odd(char* s)
    {
        while (copy_zap_char_not_null(c, strpbrk(s, "0123456789"))) {}
        printf("%s\n", ( strpbrk(c, "02468") ? "even" : "odd" ) );
    }
    
    
    int main(int argc, char** argv)
    {
        print_even_odd(argv[1]);
    }
    

答案 5 :(得分:1)

#include <stdio.h>
#include <string.h>

int main(){
    int i, count;
    char c, *p, strnum[32];

    printf("enter input number:");
    scanf("%d%*c", &i);
    sprintf(strnum, "%d", i);//or itoa, deprecated.
    p=&strnum[strlen(strnum)];
    count=sscanf(&p[-1], "%[02468]c", &c);
    printf("%d is %s\n", i, count ? "even" : "odd");
    return 0;
}


//p=strrev(strnum);//strrev is deprecated. But It works Microsoft C Compiler.
//count=sscanf(p, "%[02468]c", &c);


//printf("%d is %s\n", i, sscanf(strrev(itoa(i,(char*)malloc(32),10)), "%[02468]c", (char*)(malloc(1)) ? "even" : "odd");

答案 6 :(得分:0)

int main()
{  int  number;
   scanf("%d",&number);
    number&1 && printf("Odd") || printf("even");

}

int main()
{
int number ;
char arr[][2]={"Even","Odd"};
printf("%s\n",arr[number%2]);
}

答案 7 :(得分:0)

n&1? puts("NO"):puts("YES");

答案 8 :(得分:-2)

我认为你可以通过使用按位AND运算符来实现这一点......

scanf("%d",&n);
if( n & 1 == 1) // if last bit in numbers is 1, 'n' is odd , 0 for even

稍后您可以使用if else并切换显示该数字是偶数还是奇数。

答案 9 :(得分:-2)

我能想出的最好的......

#include <stdio.h>
int main() {
    int number;
    char oddness[4+1];
    printf("Type an integer: ");
    scanf("%d", &number);
    printf("I need some help here, user. Is it even or odd? ");
    scanf("%s", oddness);
    printf("%d is %s.\n", number, oddness);
    return 0;
}

答案 10 :(得分:-3)

如果用户将十进制数字称为浮点数而不是十进制数,那么这可能是一个可能的答案。

printf("Floating point numbers are neither even nor odd.");

An even number is an integer that is "evenly divisible" by 2, i.e., divisible by 2 without remainder; an odd number is an integer that is not evenly divisible by 2.