文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
《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之间的最大公约数。
运行结果:
获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
代码展示:
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语法与真正地入门编程。希望读者能认真得独立刷一遍。
欢迎关注,感激不尽。
与君共勉!



