Tricky C程序找到偶数和奇数

sum*_*000 22 c

这是我在微软实习期间遇到的一个具有挑战性的问题.问题是这样的:

用户输入十进制数.输出应显示的数量是否是偶数还是奇数受到约束,只有一个printf,并且没有二进制运算符,逻辑操作符,算术运算符,if-else并且switch-case可以使用.

那么任何想法?

Kei*_*son 45

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

printf("Yes, the number is even or odd\n");
Run Code Online (Sandbox Code Playgroud)

  • 我没有投票.我所做的只是http://i.stack.imgur.com/WG71u.gif (13认同)
  • 我有点尴尬,这是我在StackOverflow上得分最高的答案.(不,我不是要求人们纠正这种情况.) (9认同)
  • +1,虽然可能是"是否"这个词排除了这个答案 (3认同)
  • 鉴于措辞("..显示数字是否......"),我的第一直觉是通过`printf("%d \n",x)`"解决"它,这显然表明数字是偶数还是奇数. (2认同)

Set*_*gie 27

这将有效:

printf("Number is odd? %d\n", (int)fmod((float)i, (float)2));
Run Code Online (Sandbox Code Playgroud)

或者更好,如果你可以使用条件运算符:

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

  • 在面试问题中,算术运算符,如Modulo(%)被排除在外.所以`fmod`有点像"欺骗"我.在这个用途中,它在功能上与%相同,是吗? (17认同)
  • 或者,可以使用`stdlib.h`中的`div()/ ldiv()/ lldiv()`.或位域(不便携). (4认同)
  • @abelenky是的.他们并没有说你不能使用`()`运算符; 它使用`()`运算符和`fmod`,`i`和`2`的第一条指令的地址作为操作数:) (2认同)

Kei*_*son 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;
}
Run Code Online (Sandbox Code Playgroud)

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

要测试的值取自命令行参数.修改程序以便从中stdin或其他地方取出它将很容易.

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

转换的值n,以unsigned char将其传递到前fmod()得到具有相同的奇偶性(奇数或-均匀性),结果n,但是当转换为不会丢失精度double(即转换发生隐式地因为fmod()需要double参数).转换为无符号类型的标准定义语义使得即使在使用除二进制补码之外的表示的系统上也能正常工作.

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


tbl*_*lum 6

设x是要确定的变量.如果x是偶数,则以下代码将打印0,如果是奇数,则打印:

union
{
    unsigned char tmp:1;
} u;

u.tmp = x;    
printf("%d", u.tmp);
Run Code Online (Sandbox Code Playgroud)

  • @ sum2000 =和. (7认同)