> 文档中心 > 《JAVASE系列》经典十道基础算法题

《JAVASE系列》经典十道基础算法题


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 《JAVASE系列》经典十道基础算法题
    • 前言:
    • 1.打印出1000 - 2000年的闰年
    • 2.打印1-100的素数
    • 3.判断素数
    • 4.判断年龄在什么阶段
    • 5.水仙花数
    • 6.最大公约数
    • 7.二进制的偶数位与奇数位
    • 8.密码登录
    • 9.乘法表
    • 10.数 1 的个数
    • 总结:

《JAVASE系列》经典十道基础算法题

前言:

本章在学完javase的数据类型,运算符,循环与分支之后,写了多道算法题以后,总结了十道最经典的基础算法题

1.打印出1000 - 2000年的闰年

闰年的记录方式

普通闰年:公历年份是4的倍数且不是100的倍数为普通闰年(如2004、2020年就是闰年)。

世纪闰年:公历年份是整百数的,必须是400的倍数才是世界闰年(如2000是世纪闰年,1900不是世纪闰年)。

代码展示:

public static void main(String[] args) {int year = 0; System.out.println("leapyear:");for(year=1000;year<=2000;year++){    if((year%4==0&&year%100!=0)||year%400==0)    { System.out.println(year+" ");    }}    }

代码讲解:

通过for循环来实现1000到2000的数字,然后用选择语句来判断是否是闰年,如果是则打印,否则不打印。

运行结果

在这里插入图片描述

2.打印1-100的素数

什么是素数:

除了能被1和它本身整除而不能被其他任何数整除的数。 根据素数定义 只需要用2到n-1去除n,如果都除不尽,则n是素数,否则,只要其中有一个数能整除则n不是素数。

代码展示:

public static void main2(String[] args) { int i = 0; for(i=1;i<=100;i++) {     int flag = 0;     int j = 0;     for(j=2;j<=i-1;j++) {  if(i%j==0) {      flag = 1;      break;      }  }     if(flag==0){  System.out.println(i);     } }    }}

代码讲解

通过第一个for循环实现1-100的数字,再利用第二个for循环实现从2 到 i - 1 的数字能否整除i,如果能 i 就不是素数,记录点flag = 1,跳出第一个循环,由于flag = 1,所以最后的if语句不执行,所以不会打印出不是素数的i,如果都不能整除,则i就是素数,flag 还是为0,所以最后if语句会执行,打印出i。

运行结果:

在这里插入图片描述

3.判断素数

代码展示:

public static void main(String[] args) {    Scanner scan = new Scanner(System.in);    int PrimeNumber = scan.nextInt();    int flag = 0;    for (int i = 2; i < PrimeNumber; i++) {     if(PrimeNumber%i==0) {  flag = 1;  break;     }    }    if(flag==0){ System.out.println(PrimeNumber);    }    else{ System.out.println("noPrimeNumber");    }}

代码讲解:

在第2题原来的基础上将for循环产生的1 - 100的数字改为输入某一个数字。

运行结果:

在这里插入图片描述

4.判断年龄在什么阶段

根据输入的年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)

代码展示:

public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int age = scanner.nextInt(); if(age>=0&&age<18){     System.out.println("少年"); } else if(age>18&&age<=28) {     System.out.println("青年"); } else if(age>=28&&age<=55) {     System.out.println("中年"); } else{     System.out.println("老年"); }    }

代码讲解:

多分支情况一般用if,else语句。当然也可以用switch语句。

运行结果:

在这里插入图片描述

5.水仙花数

求出0~999之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本 身,如;153=1+5+3?,则153是一个“水仙花数“。)

代码展示:

public static void main5(String[] args) {; for (int i = 100; i < 1000; i++) {     int ret = i;     int a = ret % 10;     int b = (ret/10)%10;     int c = ret/100;     int pd = a*a*a+b*b*b+c*c*c;     if(pd == i) {  System.out.println(i);     } }    }

代码讲解:

通过 int a = ret % 10求出个位数,再通过ret/10得到百位数与十位数,%10只后就是十位数,赋值给b,b就是十位数数字,ret/100得到百位上的数字

a即为个位数,b即为十位数,c即为百位数

运行结果:

在这里插入图片描述

6.最大公约数

求两个正整数的最大公约数

代码展示:

public static void main6(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt(); int c = 0; while(a%b!=0){     c = a%b;     a=b;     b=c; } System.out.println(b);    }

代码讲解:

利用辗转相除法, 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。 它是已知最古老的算法, 其可追溯至公元前300年前。 这条算法基于一个定理: 两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。

运行结果:
在这里插入图片描述

7.二进制的偶数位与奇数位

获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列

代码展示:

public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int a1 = a; System.out.println("偶数位"); for (int i = 31; i >= 0; i-=2) {     int ret = (a>>>i)&1;     System.out.print(ret+" "); } System.out.println(); System.out.println("奇数位"); for (int i = 30; i >= 0; i-=2) {      int ret = (a1>>>i)&1;     System.out.print(ret+" "); }    }

代码讲解:

利用移位操作符来实现将一个数的二进制的每一位都与1的二进制进行逻辑与运算。只要移位之后的第一个二进制位为 1, 与 1 的二进制进行”逻辑与“运算时才为1,0则为0,ret也就只有 0 1 两种结果了。进行偶数位与奇数位的循环移位,最后得到二进制的偶数位与奇数位

运行结果:

在这里插入图片描述

8.密码登录

编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序

代码展示

public static void main8(String[] args) { Scanner scanner = new Scanner(System.in); int i = 0; while(i<3) {     String a = scanner.nextLine();     if(a.equals("123456789")){  System.out.println("输入正确");  break;     }     else{  System.out.println("输入错误,请重新输入");  i++;     } } if(i==3) {     System.out.println("错误三次!"); }    }

代码讲解:

利用循环确定输入次数,equals为字符串类型的比较方法。相同返回ture,不同返回flase,如果输入正确,则打印输入正确,跳出循环,程序结束。如果连续输入错误3次,循环结束,i==3,打印错误三次,程序结束

运行结果:

在这里插入图片描述

9.乘法表

输入n,打印n*n的乘法表

代码展示:

public static void main(String[] args) {    Scanner scanner = new Scanner(System.in);    int n = scanner.nextInt();    int i = 0;    for(i=1;i<=n;i++){ int j = 0; for(j=1;j<=i;j++){     System.out.print(i+"*"+j+" = "+ i*j);     System.out.print(" "); } System.out.println();    }}

代码讲解:

第一个for循环确定有列,使得输入n,就会有n行。第二个for循环确定列,利用i来确定第一行有一个,第二行有两个…以此类推。

运行结果:

在这里插入图片描述

10.数 1 的个数

数出一个数的二进制中 1 的个数

代码展示:

public static void main(String[] args) {    Scanner scanner = new Scanner(System.in);    int a = scanner.nextInt();    int i = 32;    int num = 0;    for(i=31;i>=0;i--){ int ret = (a>>i)&1; if(ret==1){     num++; }    }    System.out.println(num);}

代码讲解:

通过for循环来一步一步地去移位a,并与1的二进制进行逻辑与运算,如果ret=1,则有一个位的数字为1,num+1…循环32次后,循环结束。打印出num。

运行结果:

在这里插入图片描述

总结:

通过这十道题可以很好地巩固java语法与真正地入门编程。希望读者能认真得独立刷一遍。

欢迎关注,感激不尽。

与君共勉!
在这里插入图片描述