如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?_C 语言

将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0; 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。
4的整数次幂的二进制数都为 (4)100、(16)10000、(64)1000000......
另外,4的幂次方4^n也可以写为2^(2*n),即也可以写为2的幂次方,当然就满足2的幂次方的条件了,即num & num-1==0。
思路:首先用条件num & num-1==0来判断是否为2的幂次方,若不满足,则不是。若满足,在用条件num & 0x55555555来判断,若为真,则这个整数是4的幂次方,否则不是。
使用递归来实现的代码如下:

复制代码 代码如下:

#include "stdio.h"
#include "stdlib.h"
bool fn(unsigned int x)      //判断x是否是4的幂次方
{
  if ( x & (x - 1) )         //判断x是否为2的幂次方
   return false;
  return x & 0x55555555;     //判断1是否在奇数位置上
}
int log4(int value)      //递归判断一个数是4的多少次方
{
 if (value == 1)
  return 0;
 else
 {
  value>>=1;       //往右移位
  return 1+log4(value>>1);       //往右移位
 }
}
int main(void)
{
 int num;
 printf("请输入一个整数:");
 scanf("%d",&num);
 if(fn(num))     //使用与运算判断一个数是否是2的幂次方
  printf("%d是4的%d次方!\n",num,log4(num));
 else
  printf("%d不是4的幂次方!\n",num);
 system("pause");
 return 0;
}

使用非递归来实现的代码如下:

复制代码 代码如下:

#include "stdio.h"
#include "stdlib.h"
bool fn(unsigned int x)      //判断x是否是4的幂次方
{
  if ( x & (x - 1) )         //判断x是否为2的幂次方
   return false;
  return x & 0x55555555;     //判断1是否在奇数位置上
}
int log4(int value)   //非递归判断一个数是4的多少次方  
{
 int x=0;
 while(value>1)
 {
  value>>=1;      //往右移位
  value>>=1;
  x++;
 }
 return x;

int main(void)
{
 int num;
 printf("请输入一个整数:");
 scanf("%d",&num);
 if(fn(num))     //使用与运算判断一个数是否是2的幂次方
  printf("%d是4的%d次方!\n",num,log4(num));
 else
  printf("%d不是4的幂次方!\n",num);
 system("pause");
 return 0;
}

时间: 2024-10-27 03:26:51

如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?_C 语言的相关文章

C语言判断一个数是否是2的幂次方或4的幂次方_C 语言

快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个0就可以了. 如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1:因此将原来的数与去减去1后的数字进行与运算后会发现为零. 最快速的方法: (number & number - 1) == 0 原因:因为2的N次方换算是二进制为10--0这样的形式(0除外).与上自己-1的位

判断整数序列是否为二元查找树的后序遍历结果的解决方法_C 语言

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false.例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果.    8    / \  6   10 / \    / \ 5  7 9 11因此返回true.如果输入7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回false.本题网上已经有用递归单纯判断的解法. 个人解法: 先得到序列对应的中序序列, 然后看中序序列是否从小到大有序, 得出判断. 相比

C语言中判断一个数是否是回文数

注:回文数即数字顺着和反着是同一个数! 看了郝斌老师的C语言视频,虽然还只看了80多个,但是还是有一些体会,编程应该养成良好的编程风格,至少到现 在为止写的这些小程序都应该有下面这样一个过程: 1,流程:(知道程序是按照怎样的顺序运行的) 2,功能:(理解程序的作用) 3,试数:(我个人简单的理解为测试过程,把自己当作计算机去执行程序) /* 2012年4月20日 10:36:23 判断一个数是否是回文数 */ #include <stdio.h> int main(void) { int v

判断一个数是质数的优化算法

问题描述 判断一个数是质数的优化算法 判断1000 000 00内的一个数是否是素数,比较优化一点的,i从2到sqrt(i)循环判断,效率不行,希望大神指点. 解决方案 用一个表记录下已经找到的素数,判断更大的数的时候,只要判断2~sqrt(i)范围内素数表上的数就可以了.因为一个数如果可以被一个合数整除,必然可以被由它构成的素数整除. 具体算法http://blog.csdn.net/liukehua123/article/details/5482854 解决方案二: 可以参考以下链接 htt

【转载】Python脚本判断一个数是否为素数的几种方法

     质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一.基于质数定义的基础之上而建立的问题有很多世界级的难题,如哥德巴赫猜想等.算术基本定理证明每个大于1的正整数都可以写成素数的乘积,并且这种乘积的形式是唯一的.这个定理的重要一点是,将1排斥在素数集合以外.如果1被认为是素数,那么这些严格的阐述就不得不加上

using-如何判断一个数是几位数?不转换成字符串也不循环还有其它做法么?

问题描述 如何判断一个数是几位数?不转换成字符串也不循环还有其它做法么? 这是我的程序,请大侠看看 #include <iostream>using namespace std;int jiweishu(int n);int main(){ int a; cin >> a; cout << jiweishu(a);}int jiweishu(int n){ int ws = 0; while (n > 0) { n /= 10; ws++; } return ws

c++-C++实现判断一个数是偶数还是奇数

问题描述 C++实现判断一个数是偶数还是奇数 从键盘输入一个数 用一个函数 bool isOdd 判断它是否是奇数 在主程序中输出 解决方案 #include <iostream> bool isOdd(int x) { return x % 2 == 1; } int main() { int x; cin >> x; cout << isOdd(x) ? "奇数" : "偶数"; } 解决方案二: 这个都不会,汗.对2取余运算

BCD编码的进制数为整数,如何判断这个数是整数还是负数?

问题描述 BCD编码的进制数为整数,如何判断这个数是整数还是负数? BCD编码的进制数为整数,如何判断这个数是整数还是负数?求大神指点啊!!! 解决方案 在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0.负数的符号位为1.剩下的就是这个数的绝对值部分,可以采用原码.反码.补码3种形式来表示绝对值部分.原码最简单,也最好理解.原码就是绝对值的二进制数形式:例如+7的8位二进制原码是00000111,-7的8位二进制原码是10000111.但对于二进制运算而言,原码的运

c语言-C语言中如何判断一个数是否为周期数字,如:123123,12341234,123123123

问题描述 C语言中如何判断一个数是否为周期数字,如:123123,12341234,123123123 C语言中如何判断一个数是否为周期数字,如:123123,12341234,123123123 解决方案 转换成字符串,用最长公共子串(LCS)算法. 解决方案二: 可以证明的是,一个周期循环的字符串,必然它的周期是最长公共子串.有了周期,从头开始逐一比较每一段是不是这个串就可以了. 解决方案三: 最长公共子串(LCS) 解决方案四: 没有现成的函数给你用,所以要自己想办法写程序来实现. 解决方