如果 **2的n次方的二进制-1和2的n次方二进制做按位与运算,那么得出的结果肯定是0 **
if(num <= 0){ System.out.println("不是"); } else if(num == 1){ System.out.println("是"); } else{ if( (num & (num-1) ) == 0){ System.out.println("是"); } else{ System.out.println("不是"); } } 十、判断一个数字是不是ugly number判断一个数字是不是ugly number(分解出来的质因数只有2、3、5这3个数字)
思路:
如果是由2,3,5组成的,那么这个数不断除以2,3,5,最后得出的是1,这个数就是纯粹用2,3,5组成的
跟之前判断该数是否2的某次方是一样的思路~
代码:
/** * 判断一个数字是不是ugly number(分解出来的质因数只有2、3、5这3个数字) * @param num */ public static void isUgly(int num) { if (num <= 0) { System.out.println("不是"); } else { while (num % 2 == 0) { num = num / 2; } while (num % 3 == 0) { num = num / 3; } while (num % 5 == 0) { num = num / 5; } if (num == 1) { System.out.println("是"); } else { System.out.println("是"); } } }结果:
总结没错,你没看错,简单的小算法也要总结!
其实我觉得这些比较简单的算法是有"套路"可言的,你如果知道它的套路,你就很容易想得出来,如果你不知道它的套路,那么很可能就不会做了(没思路)。
积累了一定的"套路"以后,我们就可以根据经验来推断,揣摩算法题怎么做了。
举个很简单的例子:
乘法是在加法的基础之上的,那乘法我们是怎么学的?背(积累)出来的,9*9乘法表谁没背过?比如看到2+2+2+2+2,会了乘法(套路)以后,谁还会慢慢加上去。看见了5个2,就直接得出2*5了
1-n阶乘之和
求n的阶乘就用1*2*3*4*...n,实际上就是一个循环的过程,求和就套个sum变量即可!
获取二维数组每列最小的值
外层循环控制列数,内层循环控制行数,这就是遍历每列的方法~
求"1!+4!(2的平方)+9!(3的平方)+...+n的值
先求平方,再求阶乘,最后套个sum变量
数组对角线元素之和
行和列的位置相等,即是对角线上的元素
打印杨辉三角形
找出杨辉三角形的规律:第一行、第一列和列值等于行值时上的元素都是1,其余的都是头上的值加头上的左边的值
猴子吃桃子问题
根据条件,我们可以推算出前一天桃子,进而推出当天桃子(规律)。猴子都是在相等的条件(剩下桃子的一半多一个),因此就应该想到循环或者递归
计算单词的个数
利用每个单词间会有个空格的规律,用变量来记住这个状态(字母与空格)的转换,即可计算出单词的个数!
判断字母是否完全一样
将每个字母都分别装载到数组里面去,\'c-a\'就是字母c在数组的位置了(也就是2)。由于字母出现的次数不唯一,因此我们比较的是数组的值(如果出现了两次,那么值为2,如果出现了3次,那么值为3)。只要用于装载两个数组的值都吻合,那么字母就是一样!
判断一个数是不是2的某次方
最佳方案:2的某次方在二进制都有个特点:10000(n个0)--->ps:程序员的整数~..........那么比这个数少一位的二进制肯定是01111,它俩做&运算,那么肯定为0。用这个特性就非常好判断该数是否是2的某次方了
次方案:2的某次方的数不断缩小(只要number % 2 == 0就可以缩小,每次number / 2),最后的商必然是1。
判断一个数字是不是ugly number
分解出来的质因数只有2、3、5这3个数字,这题其实就是判断该数是否为2的某次方的升级版。将这个数不断缩小(只要number%2||%3||%5==0,每次number / 2 | / 3 /5 ),最后的商必然是1。