第一题:古典问题:有一对兔子,从出生后第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
package test;
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 stub
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
package test;
import java.util.Scanner;
public class test05 {
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);
}
}
第二种方法
package test;
import java.util.Scanner;
public class test06too {
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次反弹多高?
分析:第十次落地时反弹了九次
需要注意的点:无
package test;
public class test10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
double h = 100, s = h;
for (int i = 1; i < 10; i++) {
h /= 2;
s += (h * 2);
}
System.out.println("小球第十次落地时经过的路程为:" + s + " 第十次反弹的高度为:" + h / 2);
}
}
第十一题:有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输入。
分析:这题只需用三层for循环即可
需要注意的点:无
package test;
public class test11 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count = 0;
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++) {
for (int k = 1; k <= 4; k++) {
if (i != j && j != k && k != i) {
System.out.println(i * 100 + j * 10 + k);
count++;
}
}
}
}
System.out.println(count);
}
}
第十二题:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润,求应发放奖金总数?
分析:可以通过利润各部分提成的不同将利润分成不同的部分,再利用if语句解决
需要主要的点:不能用switch语句,我第一次就想用switch,结果编译器报错以下是截图

意思是switch()括号里的形参变量不能是double类型的,只能是整型,字符串和枚举类型的
package test;
import java.util.Scanner;
public class test12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
double x = sc.nextDouble();
double y = 0;
if (x >= 0 && x <= 10) {
y = x * 0.1;
} else if (x <= 20) {
y = (20 - x) * 0.075 + 10 * 0.1;
} else if (x <= 40) {
y = 10 * 0.1 + 10 * 0.075 + (x - 20) * 0.05;
} else if (x <= 60) {
y = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (x - 40) * 0.03;
} else if (x <= 100) {
y = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (x - 60) * 0.015;
} else if (x > 100) {
y = 10 * 0.1 + 10
10万+


&spm=1001.2101.3001.11974&articleId=108771706&d=1&t=3&u=7dc8191cf21240adb57633b3aaf3d0cc)

被折叠的 条评论
为什么被折叠?



