- 浏览: 21855 次
- 性别:
- 来自: 南京
最新评论
题目:给定一个整数num,判断这个整数是否是2的N次方。比如,2,4,8是2的那次方,6,10不是2的N次方。
请看下面的程序:
public static bool Check1(int num)
{
int i = 1;
while (true)
{
if (i > num)
return false;
if (i == num)
return true;
i = i * 2;
}
}
不断的循环num%2,如果不等于0,return false,如果等于0,num=num/2,一直做到num=1
public static bool Check2(int num)
{
if (num == 1)
return true;
else
{
do
{
if (num % 2 == 0)
num = num / 2;
else
return false;
}
while (num != 1);
return true;
}
}
其实这两种算法的思路都是相同的,但是第二种相对第一种更高效写,因为如果不是2的N次方,可以少循环很多次!
由于2的N次方的数二进制表示是第1位为1,其余为0,而x-1(假如x为2的N次方)得到的数的二进制表示恰恰是第1位为0,其余为1,两者相与,得到的结果就为0,否则结果肯定不为0。
public static boolean getResult(int num)
{
if (num <= 1)
{
return false;
}
else
{
return ((num & (num - 1)) == 0) ? true : false;
}
}
public static void main(String[] args) {
System.out.println(getResult(32));
}
上面的程序多判断了一个1. 我们知道, 1是2的0次方。 1应该是符合要求的。下面修正:
public static bool floor_7(int num)
{
if (num <= 1)
{
return false;
}
else
{
return ((num & (num - 1)) == 0) ? true : false;
}
}
如果一个数是2的整数次幂,那么表示为二进制的时候会是这样:010000....
除了2的零次方,即1之外,这个数减一会得到:001111....
换言之得到一个前面全是0后面全是1的数,把这个数和原数做个按位与,得到:000000.....
换言之,如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律。所以最简判断方法就是:
if ( n < 0 )
throw new InvalidOperationException();
if ( n < 2 )
return false;
return n & ( n - 1 ) == 0
修正之后:
public bool floor_8(int n)
{
if (n < 0)
throw new InvalidOperationException();
if (n < 2)
return false;
return n & (n - 1) == 0;
}
对数算法:
bool foo(int x)
{
float ret = log(x)/log(2);
return abs((int) ret - ret) <= 0.00001;
}
修正后:
public bool floor_22(int x)
{
float ret = log(x) / log(2);
return abs((int)ret - ret) <= 0.00001;
}
对数算法比较有趣, 可惜, 浮点误差毕竟不是个容易避开的问题。因为浮点数不能直接比较, 所以用了一个0.00001来做尺度。这就存在了一个问题:当x很大的时候呢?我找了一个变态的数字来测试:0x10000001
结果是true。因为结果的小数部分实在是太小了。
static void Main(string[] args)
{
int i = int.Parse(Console.ReadLine());
Console.WriteLine(IsCheck(i));
}
public static bool IsCheck(int num)
{
double result = Math.Log(num, 2);
if (result.ToString().IndexOf(".") >= 0)
{
return false;
}
else
{
return true;
}
}
相同的问题。 只要使用了LOG, 就无法避免掉浮点数丢精度的问题。 这是没办法的事情。
public static bool floor_37(int num)
{
double result = Math.Log(num, 2);
if (result.ToString().IndexOf(".") >= 0)
{
return false;
}
else
{
return true;
}
}
所以总结了下, (x)&(x-1)的算法还没有被证明, 不知道除了0还有没有别的反例。因为毕竟这个算式没有严密的证明过程。
因此我觉得, 最保险的还是位运算, 看多少个1, 来的最实在。当然这里存在一个负数的问题。第一位是1, 剩下全是0的问题。 不过有一位聪明的回复者提供了一个很强大的方法来避开负数的用例:他给参数定的类型是uint!
好吧你赢了。
请看下面的程序:
public static bool Check1(int num)
{
int i = 1;
while (true)
{
if (i > num)
return false;
if (i == num)
return true;
i = i * 2;
}
}
不断的循环num%2,如果不等于0,return false,如果等于0,num=num/2,一直做到num=1
public static bool Check2(int num)
{
if (num == 1)
return true;
else
{
do
{
if (num % 2 == 0)
num = num / 2;
else
return false;
}
while (num != 1);
return true;
}
}
其实这两种算法的思路都是相同的,但是第二种相对第一种更高效写,因为如果不是2的N次方,可以少循环很多次!
由于2的N次方的数二进制表示是第1位为1,其余为0,而x-1(假如x为2的N次方)得到的数的二进制表示恰恰是第1位为0,其余为1,两者相与,得到的结果就为0,否则结果肯定不为0。
public static boolean getResult(int num)
{
if (num <= 1)
{
return false;
}
else
{
return ((num & (num - 1)) == 0) ? true : false;
}
}
public static void main(String[] args) {
System.out.println(getResult(32));
}
上面的程序多判断了一个1. 我们知道, 1是2的0次方。 1应该是符合要求的。下面修正:
public static bool floor_7(int num)
{
if (num <= 1)
{
return false;
}
else
{
return ((num & (num - 1)) == 0) ? true : false;
}
}
如果一个数是2的整数次幂,那么表示为二进制的时候会是这样:010000....
除了2的零次方,即1之外,这个数减一会得到:001111....
换言之得到一个前面全是0后面全是1的数,把这个数和原数做个按位与,得到:000000.....
换言之,如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律。所以最简判断方法就是:
if ( n < 0 )
throw new InvalidOperationException();
if ( n < 2 )
return false;
return n & ( n - 1 ) == 0
修正之后:
public bool floor_8(int n)
{
if (n < 0)
throw new InvalidOperationException();
if (n < 2)
return false;
return n & (n - 1) == 0;
}
对数算法:
bool foo(int x)
{
float ret = log(x)/log(2);
return abs((int) ret - ret) <= 0.00001;
}
修正后:
public bool floor_22(int x)
{
float ret = log(x) / log(2);
return abs((int)ret - ret) <= 0.00001;
}
对数算法比较有趣, 可惜, 浮点误差毕竟不是个容易避开的问题。因为浮点数不能直接比较, 所以用了一个0.00001来做尺度。这就存在了一个问题:当x很大的时候呢?我找了一个变态的数字来测试:0x10000001
结果是true。因为结果的小数部分实在是太小了。
static void Main(string[] args)
{
int i = int.Parse(Console.ReadLine());
Console.WriteLine(IsCheck(i));
}
public static bool IsCheck(int num)
{
double result = Math.Log(num, 2);
if (result.ToString().IndexOf(".") >= 0)
{
return false;
}
else
{
return true;
}
}
相同的问题。 只要使用了LOG, 就无法避免掉浮点数丢精度的问题。 这是没办法的事情。
public static bool floor_37(int num)
{
double result = Math.Log(num, 2);
if (result.ToString().IndexOf(".") >= 0)
{
return false;
}
else
{
return true;
}
}
所以总结了下, (x)&(x-1)的算法还没有被证明, 不知道除了0还有没有别的反例。因为毕竟这个算式没有严密的证明过程。
因此我觉得, 最保险的还是位运算, 看多少个1, 来的最实在。当然这里存在一个负数的问题。第一位是1, 剩下全是0的问题。 不过有一位聪明的回复者提供了一个很强大的方法来避开负数的用例:他给参数定的类型是uint!
好吧你赢了。
发表评论
-
KMP快速字符串查找算法
2011-08-25 19:29 670在C/C++语言编程过程中,一般的字符串搜索操作都是通过标准库 ... -
求解最大公约数问题
2011-08-25 19:27 693最大公因数,又称最大公约数。是指 [n(≧2)个自然数 a1, ... -
堆排序(Heap Sort)算法学习
2011-08-25 19:26 1084在程序设计相关领域, ... -
整数拆分问题的动态规划解法
2011-08-25 19:26 3070输入n,和k,问将n用1到k这k个数字进行拆分,有多少种拆分方 ... -
背包问题介绍与分析
2011-08-25 19:24 1031背包问题是在1978年由Merkel和Hellman提出的。它 ... -
求平方根sqrt()函数的底层算法效率问题
2011-08-25 19:23 1291我们平时经常会有一些数据运算的操作,需要调用sqrt,exp, ... -
面试中常见的一些算法问题
2011-08-25 19:22 698Problem 1 : Is it a loop ? ( ... -
各种排序算法的C++实现与性能比较
2011-08-25 19:21 922排序是计算机算法中非常重要的一项,而排序算法又有不少实现方法, ... -
背包问题之硬币找零问题
2011-08-25 19:19 1173设有6 种不同面值的硬 ... -
求能被1到20的数整除的最小正整数
2011-08-25 19:18 1370求能被1到20的数整除的最小正整数。最直觉的方法是求1到20这 ... -
买书折扣最优惠问题解法
2011-08-25 19:17 752题目:在节假日的时候 ... -
二叉树中的最近公共祖先问题
2011-08-25 19:16 1323题目:要求寻找二叉树中两个节点的最近的公共祖先,并将其返回。 ... -
字符串逆序的算法汇总
2011-08-25 19:01 1059很早就准备写一个字符串系列的面试题,本来已经写好了,大概有十几 ... -
计算从1到N中1的出现次数
2011-08-25 18:59 599给定一个十进制整数N, ... -
KMP快速字符串查找算法
2011-08-25 18:57 966在C/C++语言编程过程中,一般的字符串搜索操作都是通过标准库 ... -
快速排序的递归实现
2011-08-25 18:54 759快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将 ... -
数字1亿里面有多少个1呢
2011-08-25 18:52 741乍看这题真够唬人的,群里看到这个题目后争先恐后的说看法。最简单 ... -
最大子序列、最长公共子串、最长公共子序列
2011-08-25 18:33 792最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续 ... -
一道关于男女比例的面试题
2011-08-25 16:56 1039阿里巴巴的一道面试题:说澳大利亚的父母喜欢女孩,如果生出来的第 ...
相关推荐
在计算机科学中,判断一个整数是否为2的N次方是一个常见的问题,尤其是在位操作、数据结构优化和算法设计中。2的N次方表示为2^n,其中n是正整数。这类数字在内存分配、数组下标计算、哈希函数设计等方面有着特殊的...
以上这篇判断一个整数是否是2的N次幂实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:C语言判断一个数是否是2的幂次方或4的幂次方如何判断一个...
在JavaScript编程中,判断一个数字是否为2的n次方幂是一个常见的算法问题。这个问题的实质是要找出一个数字是否能够表示为2的某个整数幂次。以下将详细讲解两种不同的方法来解决这个问题。 方法一基于连续除以2并...
首先定义一个名为`Triangle`的类,该类用于判断三个边长是否可以构成三角形,并计算该三角形的面积。 ```java public class Triangle { // 定义三个私有整型变量表示三角形的三边 private int a; private int b; ...
总之,易语言计算N次方的实现涉及基本的数学运算和编程逻辑,对于初学者来说,这是一个很好的练习项目,可以帮助他们巩固循环、条件判断和数值运算等基础知识,同时也能提高他们解决实际问题的能力。
在本问题中,我们要讨论如何利用位运算来判断一个数字是否为2的N次幂。 首先,让我们理解什么是2的N次幂。2的N次幂表示为2^n,其中n是一个整数。例如,2^2 = 4, 2^3 = 8, 2^4 = 16等。这些数字在二进制表示中有一个...
给定的代码片段提供了一种基础的方法来判断一个输入的整数是否为水仙花数。下面我们将对这段代码进行详细解析,并在此基础上进一步拓展关于水仙花数的算法设计与实现。 ### 代码解析 代码使用C语言编写,主要包含...
用户输入一个整数n,函数`fac(n)`会返回n的阶乘。 3. **x的n次方** `xn`函数使用递归来计算x的n次方。当n等于0时,返回1;否则,它计算x乘以x的(n-1)次方。用户输入x和n,函数会返回x的n次方。这里还处理了n为负数...
`pow()`函数位于`<math.h>`头文件中,它的基本语法是`double pow(double base, double exponent)`,用于计算底数`base`的指数`exponent`次方,并返回一个`double`类型的浮点数结果。 在给定的示例代码中,我们看到...
在C语言中,判断一个数是否为2的幂次方或4的幂次方涉及到对数值的二进制表示的理解。2的幂次方在二进制表示中具有独特特征,只有一个1,位于二进制的最低位,其余位都是0。4的幂次方同样如此,但它更进一步,要求这...
在JavaScript编程语言中,判断一个数字是否为整数是一个常见的任务。这主要涉及到对数值类型的精确检查,因为JavaScript中的数字可以是浮点数或者整数。在这个话题中,我们将深入探讨如何通过JavaScript代码来实现这...
- **输入**:多组测试数据,每组数据的第一行为一个正整数\( n \)(1 ≤ \( n \) ≤ 200,000,000)。 - **输出**:对于每组输入,输出计算得到的不同分解式数量。 #### 五、算法思路 1. **递归求解**:通过递归的方式...
将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0; 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。4的整数次幂的二进制数都为 (4)100、...
如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。 例如1^3 + 5^3 + 3^3 = 153。 1000以内的阿姆斯特朗数: 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407 2.判断一个数是否为阿姆斯特朗数 1....
在数学中,一个完全n次方数是指可以表示为某个整数的n次方的形式,比如4是一个完全2次方数,因为4=2²。而互异性则意味着这些完全n次方数是不同的,它们不共享相同的因子。 这篇博客文章可能探讨了如何寻找或计算...
在这个代码中,我们定义了一个名为 `isPowerOfThree` 的函数,它接受一个整数 `n` 作为参数,并返回一个布尔值表示 `n` 是否是3的幂次方。在 `main` 函数中,我们获取用户输入的整数,并调用 `isPowerOfThree` 函数...
本问题的核心是找到一个正整数n,使得1¹ + 2² + ... + n^n 的和不超过long数据类型能表示的最大值,即Long.MAX_VALUE。在解决这个问题时,我们将运用循环控制结构、条件判断以及数学归纳法的思想。 首先,我们要...
至于Miller-Rabin素数测试,这是一种概率性测试方法,用于判断一个大整数是否为素数。该测试基于素数分解和费马小定理,具有较高的准确性和效率。在GMP库中,虽然没有直接提供内置的Miller-Rabin测试,但开发者可以...
上述代码尝试检验一个数n是否是素数,其中`pow`函数用于计算a的n-1次方对n取模。 素数的性质之一是素数有无穷多个。数学家欧几里得在公元前300年左右证明了这一点。素数的另一个性质是素数的分布,素数定理给出了...