这是我在微软实习期间遇到的一个具有挑战性的问题.问题是这样的:
用户输入十进制数.输出应显示的数量是否是偶数还是奇数受到约束,只有一个
printf,并且没有二进制运算符,逻辑操作符,算术运算符,if-else并且switch-case可以使用.
那么任何想法?
Kei*_*son 45
愚蠢的问题需要愚蠢的答案.
printf("Yes, the number is even or odd\n");
Run Code Online (Sandbox Code Playgroud)
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)
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 char为double可能几乎不可能失去精确度.这将需要unsigned char具有难以置信的大上限. double必须至少有10个十进制数字的精度,或大约33或34位; 失去精度将要求unsigned char是至少 34个左右位(很可能我在那里有一个差一错误或两个).这样的系统可能符合要求,但我怀疑现实世界中是否存在任何此类系统.
设x是要确定的变量.如果x是偶数,则以下代码将打印0,如果是奇数,则打印:
union
{
unsigned char tmp:1;
} u;
u.tmp = x;
printf("%d", u.tmp);
Run Code Online (Sandbox Code Playgroud)