0


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

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

文章目录


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

前言:

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

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

闰年的记录方式

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

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

代码展示:

publicstaticvoidmain(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不是素数。

代码展示:

publicstaticvoidmain2(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.判断素数

代码展示:

publicstaticvoidmain(String[] args){
    Scanner scan =newScanner(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以上)

代码展示:

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

代码讲解:

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

运行结果:

在这里插入图片描述

5.水仙花数

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

代码展示:

publicstaticvoidmain5(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.最大公约数

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

代码展示:

publicstaticvoidmain6(String[] args){
        Scanner scanner =newScanner(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.二进制的偶数位与奇数位

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

代码展示:

publicstaticvoidmain(String[] args){
        Scanner scanner =newScanner(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.密码登录

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

代码展示

publicstaticvoidmain8(String[] args){
        Scanner scanner =newScanner(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的乘法表

代码展示:

publicstaticvoidmain(String[] args){
    Scanner scanner =newScanner(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 的个数

代码展示:

publicstaticvoidmain(String[] args){
    Scanner scanner =newScanner(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语法与真正地入门编程。希望读者能认真得独立刷一遍。

欢迎关注,感激不尽。

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


本文转载自: https://blog.csdn.net/simple_person/article/details/123489248
版权归原作者 嘉然说她喜欢吃鱼 所有, 如有侵权,请联系我们删除。

“《JAVASE系列》经典十道基础算法题”的评论:

还没有评论