Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有多少种方法可以判断一个数字是否为偶数,哪种方法最快、最清晰?_Algorithm_Math - Fatal编程技术网

Algorithm 有多少种方法可以判断一个数字是否为偶数,哪种方法最快、最清晰?

Algorithm 有多少种方法可以判断一个数字是否为偶数,哪种方法最快、最清晰?,algorithm,math,Algorithm,Math,给定任何数字,确定它是偶数的最佳方法是什么?你能想到多少种方法,最快和最清晰的方法是什么?你可以使用整数除法并将其除以2,然后检查余数,或者使用模运算符并将其修改为2,然后检查余数。“最快”的方法取决于语言、编译器和其他因素,但我怀疑有许多平台存在显著差异。您可以使用整数除法并将其除以2,然后检查余数,或者使用模运算符并将其修改为2,然后检查余数。“最快”的方式取决于语言、编译器和其他因素,但我怀疑是否有许多平台存在显著差异 bool isEven = number % 2 == 0; boo

给定任何数字,确定它是偶数的最佳方法是什么?你能想到多少种方法,最快和最清晰的方法是什么?

你可以使用整数除法并将其除以2,然后检查余数,或者使用模运算符并将其修改为2,然后检查余数。“最快”的方法取决于语言、编译器和其他因素,但我怀疑有许多平台存在显著差异。

您可以使用整数除法并将其除以2,然后检查余数,或者使用模运算符并将其修改为2,然后检查余数。“最快”的方式取决于语言、编译器和其他因素,但我怀疑是否有许多平台存在显著差异

bool isEven = number % 2 == 0;
bool isEven = ((number & 0x01) == 0)
问题是“任意数字”,因此可以丢弃浮点数或以另一种方式处理浮点数,方法可能是首先将浮点数放大为整数值,注意溢出,即将2.1更改为21(乘以10并转换为int),然后进行测试。然而,可以合理地假设,提出问题的人提到“任何数字”实际上是指积分值


问题是“任意数字”,因此可以丢弃浮点数或以另一种方式处理浮点数,方法可能是首先将浮点数放大为整数值,注意溢出,即将2.1更改为21(乘以10并转换为int),然后进行测试。然而,可以合理地假设,提出问题的人提到“任何数字”实际上是指整数值。

是的。。最快的方法是检查1位,因为它为所有奇数设置,为所有偶数取消设置


按位AND非常快。

是的。。最快的方法是检查1位,因为它为所有奇数设置,为所有偶数取消设置


按位AND非常快。

这在ruby中更容易实现:

isEven = number.even?

这在ruby中更容易实现:

isEven = number.even?

如果您的类型“a”是整数类型,那么我们可以定义

even :: Integral a => a -> Bool
even n =  n `rem` 2 == 0

根据Haskell序曲。

如果您的类型“a”是一个整数类型,那么我们可以定义

even :: Integral a => a -> Bool
even n =  n `rem` 2 == 0
isEven(n) = ((-1) ^ n) == 1
根据哈斯克尔的前奏曲

isEven(n) = ((-1) ^ n) == 1
其中^是您的语言的求幂/pow函数

我没有说它是快速或清晰的,但它有新颖的价值

其中^是您的语言的求幂/pow函数


我没有说它是快速或清晰的,但它有新颖的价值。

对于浮点,当然在合理的范围内

modf(n/2.0, &intpart, &fracpart)
return fracpart == 0.0
使用其他一些随机数学函数:

return gcd(n,2) == 2

return lcm(n,2) == n

return cos(n*pi) == 1.0

对于浮点,当然在合理的范围内

modf(n/2.0, &intpart, &fracpart)
return fracpart == 0.0
使用其他一些随机数学函数:

return gcd(n,2) == 2

return lcm(n,2) == n

return cos(n*pi) == 1.0

如果是低电平,请检查最后一位(LSB)是0还是1:)

0=偶数
1=奇数


否则,+1@sipwiz:“bool isEven=number%2==0;”

如果是低电平,请检查最后一位(LSB)是0还是1:)

0=偶数
1=奇数


否则,+1@sipwiz:“bool isEven=number%2==0;”

假设您正在处理一个整数,则以下操作将起作用:

如果((testnumber&-2)=testnumber),则testnumber是偶数

基本上,十六进制中的-2将是FFFE(对于16位),如果数字为偶数,则与-2进行anding将保持不变。
**Tom**

假设您处理的是一个整数,以下操作将起作用:

如果((testnumber&-2)=testnumber),则testnumber是偶数

基本上,十六进制中的-2将是FFFE(对于16位),如果数字为偶数,则与-2进行anding将保持不变。
**Tom**

保留有限的堆栈空间(这可能是尾部呼叫的候选者吗?)

公共静态bool IsEven(int num){
if(num<0)
return!IsEven(-num-1);
如果(num==0)
返回true;
返回IsEven(-num);
}

保留有限的堆栈空间。;)(这可能是尾部呼叫的候选者吗?)

公共静态bool IsEven(int num){
if(num<0)
return!IsEven(-num-1);
如果(num==0)
返回true;
返回IsEven(-num);
}
实际上,我认为(n%2==0)就足够了,这很容易理解,大多数编译器也会将其转换为位操作

我用gcc-O2标志编译了这个程序:

#include <stdio.h>

int main()
{
    volatile int x = 310;
    printf("%d\n", x % 2);
    return 0;
}
我们可以看到%2操作已经转换为andl指令。

实际上我认为(n%2==0)已经足够了,这很容易理解,大多数编译器也会将其转换为位操作

我用gcc-O2标志编译了这个程序:

#include <stdio.h>

int main()
{
    volatile int x = 310;
    printf("%d\n", x % 2);
    return 0;
}

我们可以看到%2操作已转换为andl指令。

类似于DeadHead的注释,但效率更高:

#include <limits.h>

bool isEven(int num)
{
    bool arr[UINT_MAX] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
                           0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                           // ...and so on
    };
    return arr[num];
}
#包括
布尔伊塞文(整数)
{
bool arr[UINT_MAX]={1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,1,0,1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1,
bool is_even = (number << 31) == 0;
bool is_odd = (number << 31) < 0;
bool is_odd = (number << 31) != 0;