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