一道面试题。。。 判断一个数字是否为2的阶次方数8,64,256都是2的阶次方数(例8是2的3次方),用java编写程序,用两种方法来判断一个整数是不是2的阶次方数,并说明哪个方法更好。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/ZangXT/archive/2008/10/31/3193497.aspx public class Main{ public static void main(String[] args) { for(int i=2;i<1000;i++){ if((i&(i-1))==0){ System.out.println(i); } } }}正解! 如果给定的数字是负数或者0, 报错如果给点的数字是1, 返回0, 因为任何数的0次方都为0;对于其他的数字,可进行如下判断: 在循环中,每次循环都将一个临时变量(初始值为1)乘以2; 同时计数器(初始值为0)加1; 如果得出的结果 > 给定的数,说明它不是2的阶乘; 如果得出的结果 = 给定的数,说明它是2的阶乘,具体的阶乘输就是计数器的值; 如果得出的结果 < 给定的数, 继续循环方法2的话,就是上述方法的逆操作 在循环中判断对给定的数进行除以2的运算呵呵,这是个笨方法~ public class Test { public static void main(String[] args) { if(new Test().isJieCi(256)) { System.out.println("该数字是为2的阶次方数"); } } public boolean isJieCi(int i) { boolean b = false; if(i%2 == 0) { b=true; } return b; }} public static void cacu(int a){ if(a%2!=0){ System.out.println("很明显不符合要求!"); return; } for(int i=1; i<Integer.MAX_VALUE; i*=2){ if(a == i){ System.out.println(i + " 符合要求!"); break; } } }贴个常规的方法,不太好,如果是偶数,而又不是2的阶次方的话就很麻烦…… public class JiSuan { public static void main(String[] args) { int a = 107375; int b = 256; cacu(a); cacu(b); } public static void cacu(int a){ for(int i=1; i<=Integer.MAX_VALUE/2+1; i*=2){ if(a == i){ System.out.println(i + " 符合要求!"); return; } if(i == Integer.MAX_VALUE/2+1){ System.out.println(a + " 不符合要求"); return; } } }}这次没问题了,感觉也还不错,比较容易想到,最多31次循环,也不复杂。 public static void main(String[] args) { for(int i=2;i<1000;i++) { if((i&(i-1))==0) { System.out.println(i); } }}很准确,也很有效率 7楼的大哥,你的结果不对。if(new Test().isJieCi(14)) 运行结果:该数字是为2的阶次方数, 我也贡献一个吧public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int n=32; if(jieC(n)) System.out.println(n+"是2的阶乘!"); else System.out.println(n+"不是2的阶乘!"); } public static boolean jieC(int n){ if(n<0) return false; while(n%2==0){ if(n==0 || n==2) return true; int m=n/2; n=m; } return false; }}大家看看符合不? public class Test { public static void main(String args[]) { Integer num = 1024; System.out.println(Integer.toBinaryString(num).matches("10*")); }} import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Test { static BufferedReader br=null; public static void main(String[] args) { br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入一个数:"); int a; try { a = Integer.parseInt(br.readLine()); if(new Test().func(a)==-1){ System.out.println("不是2的阶次方数"); }else{ System.out.println("是2的"+new Test().func(a)+"方数"); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public int func(int a){ for(int i=0;i<100;i++) { if(Math.pow(2, i)==a) { return i; } } return -1; }} //因为输入数字可能为floaw,double型,所以我要把传入参数定为String类型 public boolean IsTest(String num) { //前提是判断是否为整数,因为只有整数才能,其他的都不行 if (isNumeric(num)) { int i = Integer.parseInt(num); // 首先判断是1,0数字或为小于1的数字,如果是,就不进行一下判断直接返回false if (i == 0 || i == 1 || i < 1) { return false; } else { if (i % 2 == 0) { return true; } else { return false; } } }else { return false; } } //判断数字是否是整数 public boolean isNumeric(String str) { java.util.regex.Pattern pattern = Pattern.compile("[0-9]*"); java.util.regex.Matcher isNum = pattern.matcher(str.trim()); if (!isNum.matches()) { return false; } return true; } 如果一个数是2的阶次方数,这么这个数的2进制最高位为1,其余几位为0,比这个数小1的数的2进制最高位为0,其余位则为1,因此这两个二进制数相与结果就为0,所心程序可以这样写:public class Main{ public static void main(String[] args) { for(int i=2;i <1000;i++){ if((i&(i-1))==0){ System.out.println(i); } } } } 相信很多人&、|、^、~之类的位操作符都遗忘了吧,我也是……当补课了…… enum中的数据如何赋初值? 请问HQL的问题 在CSDN成长3年多了,现在把原创作品奉献给CSDN的朋友,都有源代码如果有问题欢迎指正 32位虚拟机下编译的java程序放到64位虚拟机下可以直接运行吗? 如此简单的程序,JDK1.5却报一个非常奇怪的错 为什么我在ContentPane中add一个component后,要改变Frame的大小才能显示正确??? 我在读pdf文件时不能读碰到这样一个问题:有谁碰到过这样的问题吗? 向高手学习 applet本地打印问题 请问JAVA的培训,可以相信吗? 一个一维数组和一个二维数组克隆,用clone()方法 大数组,有没有高效率的实现方法,高手指教
public static void main(String[] args) {
for(int i=2;i<1000;i++){
if((i&(i-1))==0){
System.out.println(i);
}
}
}
}正解!
如果给点的数字是1, 返回0, 因为任何数的0次方都为0;
对于其他的数字,可进行如下判断:
在循环中,每次循环都将一个临时变量(初始值为1)乘以2;
同时计数器(初始值为0)加1;
如果得出的结果 > 给定的数,说明它不是2的阶乘;
如果得出的结果 = 给定的数,说明它是2的阶乘,具体的阶乘输就是计数器的值;
如果得出的结果 < 给定的数, 继续循环方法2的话,就是上述方法的逆操作
在循环中判断对给定的数进行除以2的运算呵呵,这是个笨方法~
public static void main(String[] args)
{
if(new Test().isJieCi(256))
{
System.out.println("该数字是为2的阶次方数");
}
}
public boolean isJieCi(int i)
{
boolean b = false;
if(i%2 == 0)
{
b=true;
}
return b;
}
}
public static void cacu(int a){
if(a%2!=0){
System.out.println("很明显不符合要求!");
return;
}
for(int i=1; i<Integer.MAX_VALUE; i*=2){
if(a == i){
System.out.println(i + " 符合要求!");
break;
}
}
}
贴个常规的方法,不太好,如果是偶数,而又不是2的阶次方的话就很麻烦……
public class JiSuan { public static void main(String[] args) {
int a = 107375;
int b = 256;
cacu(a);
cacu(b);
}
public static void cacu(int a){ for(int i=1; i<=Integer.MAX_VALUE/2+1; i*=2){
if(a == i){
System.out.println(i + " 符合要求!");
return;
}
if(i == Integer.MAX_VALUE/2+1){
System.out.println(a + " 不符合要求");
return;
}
}
}
}
这次没问题了,感觉也还不错,比较容易想到,最多31次循环,也不复杂。
public static void main(String[] args)
{
for(int i=2;i<1000;i++)
{
if((i&(i-1))==0)
{
System.out.println(i);
}
}
}
很准确,也很有效率
public class StringTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=32;
if(jieC(n))
System.out.println(n+"是2的阶乘!");
else
System.out.println(n+"不是2的阶乘!");
}
public static boolean jieC(int n){
if(n<0) return false;
while(n%2==0){
if(n==0 || n==2) return true;
int m=n/2;
n=m;
}
return false;
}}大家看看符合不?
public static void main(String args[]) {
Integer num = 1024;
System.out.println(Integer.toBinaryString(num).matches("10*"));
}
}
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
static BufferedReader br=null;
public static void main(String[] args) {
br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一个数:");
int a;
try {
a = Integer.parseInt(br.readLine());
if(new Test().func(a)==-1){
System.out.println("不是2的阶次方数");
}else{
System.out.println("是2的"+new Test().func(a)+"方数");
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public int func(int a){
for(int i=0;i<100;i++) {
if(Math.pow(2, i)==a) {
return i;
}
}
return -1;
}
}
public boolean IsTest(String num) {
//前提是判断是否为整数,因为只有整数才能,其他的都不行
if (isNumeric(num)) {
int i = Integer.parseInt(num);
// 首先判断是1,0数字或为小于1的数字,如果是,就不进行一下判断直接返回false
if (i == 0 || i == 1 || i < 1) {
return false;
} else {
if (i % 2 == 0) {
return true;
} else {
return false;
}
}
}else
{
return false;
}
}
//判断数字是否是整数
public boolean isNumeric(String str) {
java.util.regex.Pattern pattern = Pattern.compile("[0-9]*");
java.util.regex.Matcher isNum = pattern.matcher(str.trim());
if (!isNum.matches()) {
return false;
}
return true;
}
public class Main{
public static void main(String[] args) {
for(int i=2;i <1000;i++){
if((i&(i-1))==0){
System.out.println(i);
}
}
}
}