《JAVASE系列》经典十道基础算法题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 《JAVASE系列》经典十道基础算法题
《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语法与真正地入门编程。希望读者能认真得独立刷一遍。
欢迎关注,感激不尽。
与君共勉!