> 文档中心 > Java练习集之方法篇 —— Java SE

Java练习集之方法篇 —— Java SE

 

目录

1.判定一个数字是否是素数(三种方法) 

2.求最大公约数+最小公倍数

3.求出0~999之间的所有“水仙花数”并输出(拓展一下)

4.写出一个函数返回参数二进制中1的个数(三种方法)


本篇中所出现的题,都是属于简单难度的题,重点是将要使用多种方法来做题,提高算法的效率,让面试官给你竖起大拇指,方法由易到难,看看有没有你没想到的方法

1.判定一个数字是否是素数(三种方法) 

 

我们先来写第一种方法,也是大家最容易想到的方法,就是根据素数的性质(用除了1和它本身外的数字除以它,能被整除就不是素数),直接写代码吧。

   public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int i = 2; for(; i < a ; i++){     if(a%i == 0){  System.out.println("不是素数");  break;     } } //1.i==a  2.a%i==0 if(i == a){     System.out.println("是素数"); }    }

素数这道题也是百度面试曾经考过的,所以我们要想办法提高一下算法效率,优化一下

所以就有了第二种方法 

    public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int i = 2; for(; i  a/2){     System.out.println("是素数"); }    }

在学会第二种方法后,你再想能不能再提升一下算法效率,让简单的题,因为你的算法而不简单

所以第三种方法来了

 

    public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int i = 2; for(; i  Math.sqrt(n)){     System.out.println("是素数"); }    }

2.求最大公约数+最小公倍数

这个题主要是为了让大家明白

计算最大公约数是用辗转相除法,然后最小公倍数是通过两数之乘积除以最大公约数。

下面直接上代码吧

public class TestDemo01 {public static void main(String[] args) {    //辗转相除法    Scanner scanner = new Scanner(System.in);    int a = scanner.nextInt();    int b = scanner.nextInt();    int c = a%b;    int b1 = b;    while (c != 0) { a = b1; b1 = c; c = a%b1;    }    System.out.println(b1+" 是最大公约数!");    //知道最大公约数,算最小公倍数    //可以将两数相乘再除以最大公约数    System.out.println(a*b/b1+"最小公倍数! ");    }}

3.求出0~999之间的所有“水仙花数”并输出(拓展一下)

相信大家水仙花数的这个题肯定做过,我们这里给大家拓展一下,除了三位水仙花数外,还有什么

 

public class TestDemo01 {public static void main(String[] args) {    for (int i = 1; i < 999999; i++) { int count=0;//位数 int tmp = i; while(tmp != 0){     count++;     tmp /= 10;      } //tmp ==0; count==计算出的位数; tmp = i; int sum = 0; while(tmp != 0){     sum += Math.pow(tmp%10,count);     tmp /= 10; } //此时tmp中存放的就是每一位的count次方和 if(sum == i){     System.out.println(i); }    }}}

4.写出一个函数返回参数二进制中1的个数(三种方法)

我们最容易想到的第一个方法就是把这个数通过移位运算符变化然后再&1,计算出二进制中1的个数

public class TestDemo01 {public static void main(String[] args) {    Scanner scanner = new Scanner(System.in);    int n = scanner.nextInt();    int count = 0;    for(int i=0;i>i) &1) != 0 ){     count++; }    }    System.out.println(count);}}

但是这种方法不高效,需要移动32次,那么可不可以优化一下,使算法效率提高

所以第二种方法

public class TestDemo01 {public static void main(String[] args) {    Scanner scanner = new Scanner(System.in);    int n = scanner.nextInt();    int count = 0;    while(n != 0){ if( (n & 1) != 0){     count++; } n=n>>>1;    }    System.out.println(count);    }}

大家可以发现我们这里使用了一个>>>,就可以输入负数了

再给大家上一个第三种方法,提升一下算法思维 

public static void main(String[] args) { Scanner scanner= new Scanner(System.in); int n = scanner.nextInt(); int count = 0; while(n != 0){     n = n&(n-1);     count++; }    System.out.println(count);    }