经典Java算法50题(总)
第⼀题:古典问题:有⼀对兔⼦,从出⽣后第3个⽉起每个⽉都⽣⼀对兔⼦,⼩兔⼦长到第三个⽉后每个⽉⼜⽣⼀对兔⼦,假如兔⼦都不死,问每个⽉的兔⼦总数为多少?
分析:通过简单的分析我们就可以发现,只有第⼀、⼆个⽉的兔⼦总数都为⼀,从第三个⽉开始,第n个⽉的兔⼦总数都是第(n-1)+(n-2)⽉的。
需要注意的点:数组的第⼀个下标为0,因此输出第n个⽉的兔⼦总数时数组下标应该为n-1
package test;
import java.util.Scanner;
public class test01 {
public static void main(String[] args){
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
System.out.println("请输⼊你想查看的兔⼦总数的⽉份");
int n = sc.nextInt();
int[] m =new int[n];
m[0]= m[1]=1;
for(int i =2; i < n; i++){
m[i]= m[i -1]+ m[i -2];
}
System.out.println("第"+ n +"个⽉的兔⼦总数是"+ m[n -1]);
}
}
第⼆题:判断101-200之间有多少个素数,并输出所有素数。
分析:素数⼜叫质数,质数是指在⼤于1的⾃然数中,除了1和它本⾝以外,不能被其他⾃然数整除的数。
需要注意的点:在第⼆层for循环中,我⽤的判断条件是将j<i/2,其实⽤Math.sqrt(i)更好,可以减少程序的复杂度
package test;
public class test02 {
public static void main(String[] args){
// TODO Auto-generated method stub
int j;
for(int i =101; i <=200; i++){
for(j =2; j < i /2; j++){
if(i % j ==0)
break;
}
if(j == i /2){
System.out.println(i);
}
}
}
}
第三题:打印出所有的"⽔仙花数",所谓"⽔仙花数"是指⼀个三位数,其各位数字⽴⽅和等于该数本⾝。例如:153是⼀个"⽔仙花数",因为153=1的三次⽅+5的三次⽅+3的三次⽅。
分析:根据题⽬我们可以锁定⽔仙花数的范围,然后将⽔仙花数的各位拆分,在判断该数是否是⽔仙花数
需要注意的点:对与我这种做法⽽⾔,将数拆分时不能直接在i下⾯赋值,这样a、b、c就是⼀个确定的数了。需要在for循环的内部定义,使每个i值都对应⼀个a、b、c
public class test03 {
public static void main(String[] args){
// TODO Auto-generated method stub
int i =100;
// int a = i / 100;(不能在这⾥定义)
// int b = i / 10 % 10;
// int c = i % 10;
System.out.print("⽔仙花数为:");
for(; i <1000; i++){
int a = i /100;
int b = i /10%10;
int c = i %10;
if(a * a * a + b * b * b + c * c * c == i){
System.out.print(i +" ");
}
}
}
}
第四题:将⼀个正整数分解质因数。例如:输⼊90,打印出90=233 *5。
分析:分解质因数,只需要⽤输⼊的数n从2开始,慢慢往上除就⾏了
需要注意的点:以输⼊90为例,当i=3时,45/3=15,此时15%3==0,所以还需要以3为被除数,这就需要我们定义的被除数i不能使⽤⼀次就i++,具体怎么做请参照下⾯的程序
package test;
import java.util.Scanner;
public class test04 {
public static void main(String[] args){
// TODO Auto-generated method stubnextint()方法
Scanner sc =new Scanner(System.in);
System.out.println("请输⼊⼀个数:");
int n = sc.nextInt();
int i =2;
while(n >= i){
if(n == i){
System.out.println(n);
break;
}else if(n % i ==0){
System.out.print(i +" ");
n /= i;
}else{
i++;
}
}
}
}
第五题:利⽤条件运算符的嵌套来完成此题:学习成绩>=90分的同学⽤A表⽰,60-89分之间的⽤B表⽰,60分以下的⽤C表⽰。
分析:条件运算符是唯⼀⼀个三⽬运算符,语法:语句1 if条件表达式else语句2。条件运算符在执⾏时,会先对条件表达式进⾏求值判断如果判断结果为true,就执⾏语句1,并返回执⾏结果。如果判断结果为false,就执⾏语句2,并返回执⾏结果。
需要注意的点:本题条件运算的返回结果是字符,所以grade应该定义为char
public static void main(String[] args){
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
int score = sc.nextInt();
char grade = score >=90?'A': score >=60?'B':'C';
System.out.println(grade);
}
}
第六题:输⼊两个正整数m和n,求其最⼤公约数和最⼩公倍数。
分析:其它的点都容易,主要是对最⼤公约数的求法,⼀般有三种算法,在这⾥我展⽰了两种,有兴趣的朋友可以查查
需要注意的点:在使⽤辗转相除法求最⼤公约数时需要事先知道两个数的⼤⼩关系,但⽤更相减损法的时候不需要知道两个数的⼤⼩关系。package test;
import java.util.Scanner;
public class test06 {
public static void main(String[] args){
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
int a = sc.nextInt(), b = sc.nextInt();
if(a < b){
int t;
t = a;
a = b;
b = t;
}
int a1 = a, b1 = b;// 向a、b的原值保留⽤来求最⼩公倍数
while(a1 % b1 !=0){// 辗转相除法
int temp = b1;
b1 = a1 % b1;
a1 = temp;
}
int c = a * b / b1;// 最⼩公倍数
System.out.println("最⼤公约数为:"+ b1 +",最⼩公倍数为:"+ c);
}
}
第⼆种⽅法
public static void main(String[] args){
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
int a = sc.nextInt(), b = sc.nextInt();
int a1 = a, b1 = b;// 向a、b的原值保留⽤来求最⼩公倍数
while(a1 != b1){// 更相减损法
if(a1 > b1){
a1 -= b1;
}else{
b1 -= a1;
}
}
int c = a * b / b1;// 最⼩公倍数
System.out.println("最⼤公约数为:"+ b1 +",最⼩公倍数为:"+ c);
}
}
第七题:输⼊⼀⾏字符,分别统计出其中英⽂字母、空格、数字和其它字符的个数。
分析:这题主要是要历遍全部字符以及判断字符属于哪⼀类
需要注意的点:在Java中没有直接从键盘上接收char型字符的⽅法,因此我们在需要从键盘上接收字符时可以借助String类型的字符串,然后通过toCharArray()⽅法将之保存到char[]类型的数组中,或者⾃⼰写⼀个简单的⽅法来接收字符
package test;
import java.util.Scanner;
public class test07 {
public static void main(String[] args){
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
String s = sc.nextLine();
char[] ch = s.toCharArray();
int count1 =0, count2 =0, count3 =0, count4 =0;
for(int i =0; i < ch.length -1; i++){
if(ch[i]>'0'&& ch[i]<'9'){
count1++;
}else if((ch[i]>'a'&& ch[i]<'z')||(ch[i]>'A'&& ch[i]<'Z')){
count2++;
}else if(ch[i]==' '){
count3++;
}else{
count4++;
}
}
System.out.println("数字的个数为:"+ count1);
System.out.println("字符的个数为:"+ count2);
System.out.println("空格的个数为:"+ count3);
System.out.println("其它字符的个数为:"+ count4);
}
}
第⼋题:求s=a+aa+aaa+aaaa+aa…a的值,其中a是⼀个数字。例如2+22+222+2222+22222(此时共有5个数相加),⼏个数相加有键盘控制。
分析:这题主要是要得到各项的值
需要注意的点:⽆
package test;
import java.util.Scanner;
public class test08 {
public static void main(String[] args){
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
int a = sc.nextInt();
int n = sc.nextInt();
int b =0, sum =0;
for(int i =0; i < n; i++){
b += a;
sum += b;
a *=10;
}
System.out.println(sum);
}
}
第九题:⼀个数如果恰好等于它的因⼦之和,这个数就称为"完数"。例如6=1+2+3.编程 出1000以内的所有完数。
分析:因⼦就是除去这个数本⾝之外,所有可以被这个数整除的数
需要注意的点:在第⼀层for循环和第⼆层for循环之间需要让sum=0,不然会影响最后⼀个if()对下⼀个值的判断
package test;
public class test09 {
public static void main(String[] args){
// TODO Auto-generated method stub
int i =1, sum =0;
for(; i <=1000; i++){
sum =0;
for(int j =1; j < i; j++){
if(i % j ==0){
sum += j;
}
}
if(sum == i){
System.out.println(sum);
}
}
}
}
第⼗题:⼀球从100⽶⾼度⾃由落下,每次落地后反跳回原⾼度的⼀半;再落下,求它在 第10次落地时,共经过多少⽶?第10次反弹多⾼?
分析:第⼗次落地时反弹了九次
需要注意的点:⽆

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。