在不使用数学/按位运算符的情况下查找偶数/奇数

时间:2009-12-26 10:53:06

标签: c++

我最近被要求编写一个程序,在不使用任何数学/位运算符的情况下确定数字是偶数还是奇数!

有什么想法吗?

谢谢!

10 个答案:

答案 0 :(得分:35)

这可以使用如下代码中的1位字段来完成:

#include<iostream>

struct OddEven{
    unsigned a : 1;
};
int main(){
    int num;
    std::cout<<"Enter the number: ";
    std::cin>>num;
    OddEven obj;
    obj.a = num;
    if (obj.a==0)
        cout<<"Even!";
    else
        cout<<"Odd!";
    return 0;
}

因为obj.a是一个单字段值,所以只有LSB会被保存!你可以检查一下你的答案.. 0 - &gt;即便如此,奇怪...... !!

答案 1 :(得分:14)

最简洁的问题解决方案:

#include <iostream>
#include <string>
#include <bitset>

int main() {
  std::string const type[] = {"even", "odd"};
  int n;
  std::cout << "Enter an integer." << std::endl;
  std::cin >> n;
  std::cout << type[(std::bitset<1>(std::abs(n))[0])] << std::endl;
}

答案 2 :(得分:6)

switch (n) {
    case 0:
    case 2:
    case 4:
    ...
        return Even;
}
return Odd;

答案 3 :(得分:5)

您可以将数字转换为字符串,并检查最后一位数字是否为1,3,5,7或9。

答案 4 :(得分:2)

我不确定==是否被视为数学运算符,如果不是,则将数字转换为字符串并测试最后一个字符是否等于0,2,4,6或8。

编辑: ==似乎被视为比较运算符/关系运算符。

答案 5 :(得分:1)

......你为什么要这样做?

只有在您尝试避免撰写 +, - ,/,*,&amp;,|时才可以这样做。 ^,或%。

开关和字符串转换具有隐式查找表,因此也是隐式添加。

以下是为了避免它:

//C/C++ code (psuedo'd up)
struct BitNum
{
  unsigned int num : 1;
};

...
BitNum a;
a.num = number_to_be_tested;
if(a.num == 0) return EVEN;

return ODD;
...

但隐含的用途&amp;得到了一点点。

答案 6 :(得分:1)

这是一个奇怪的挑战。

您可以将该数字用作加载指令的内存地址偏移量。如果您的架构要求内存访问在双字节偏移上对齐,则处理器将允许来自偶数地址的加载并为奇数地址(未对齐的加载)抛出异常。

答案 7 :(得分:0)

如何简单按位或?

bool is_odd(const int &number){
 return (number == (number | 1));
}
bool is_even(const int &number){
 return (number != (number | 1));
}

(编辑)嗯......我想我应该阅读标题呃?

答案 8 :(得分:0)

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

void main()
{
    int num;
    scanf("%d",&num);

    if(fmod(num,2))
    {
        printf("number is odd");
    }
    else
        printf("number is even");
}

答案 9 :(得分:0)

#include<stdio.h>
int main()
{
   int num,res;
   printf("\nEnter the number=");
   scanf("%d",&num);
   res=num&1;
   if(res==0)
     printf("Number is even");
   else
     printf("Number is odd");
   return 0;
}