以下程序分析是老师给出的提示,解答思路是自己的思考
1、题目:有一对兔子,从出生后第三个月起每个月都升一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
解答思路:兔子状态分为newBorn(新生),oneM(一个月之后),adult(成年),这里分别对应第一、二、三个月
第一个月总数为1对,考虑接下来的几个月,变化情况为newBorn->oneM,oneM->adult,而adult会产生newBorn,有几只adult就会产生几只newBorn
这里为了避免赋值出现问题,我们把表达式顺序倒过来,否则newBorn->oneM->adult,他们的值都一样了。
兔子的总数=原总数+新生数
代码:
import java.util.*;
public class Rabbit{
public static void main(String[]args){
int sum=1;
int adult=0;
int newBorn=1;
int oneM=0;
System.out.print("how many month later:");
Scanner x=new Scanner(System.in);
int time=x.nextInt();
System.out.println("最初兔子总数为:"+sum+"对");
for(int t=1;t<=time;t++){
adult=adult+oneM;
//System.out.println("adult="+adult);
oneM=newBorn;
//System.out.println("oneM="+oneM);
newBorn=adult;
//System.out.println("newBorn"+newBorn);
sum=sum+newBorn;
System.out.println(t+"月之后,兔子总数为:"+sum+"对");
}
}
}
2.题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
注:这里为什么是2到sqrt(这个数),因为如果这个数==n*n,如果不能被小于n的数整除,那么肯定也不能被大于n的数整除,因为如果这个数用两个数相乘表示,肯定有一个大于n,一个小于n
代码:
import java.util.*;
//导入使用sqrt的包
import static java.lang.Math.*;
public class Prime{
public static void main(String[] args){
//局部变量一定要注意它的作用域
ArrayList<Integer>list=new ArrayList<Integer>();
for(int target=101;target<201;target++){
//这里的j,用boolen值更好
int i=2,j=0;
int sq=(int)sqrt(target);
for(i=2;i<sq;i++){
//这里是target对i取余,不是sq
if(target%i==0){
j=1;
break;
}
}
if(j!=1){
list.add(target);
}
}
for(int m=0;m<list.size();m++){
System.out.print(list.get(m)+" ");
}
}
}
解题思路:求出百位、十位、个位是多少,分别平方后与原数比较
代码:
import java.lang.Math.*;
public class Narcissistic{
public static void main(String [] args){
for(int num=100;num<1000;num++){
int hund=num/100;
int ten=(num%100)/10;
int unit=num%10;
if(Math.pow(hund,3)+Math.pow(ten,3)+Math.pow(unit,3)==num){
System.out.print(num+" ");
}
}
}
}
4.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
易错点:1)list的使用方法
2)while循环中k的增加
3)容易忘记list添加完k值之后需要添加n
4)list.get(),括号中数要小于list的长度,因为长度是从1开始,而list从0开始
import java.util.*;
public class Factor{
public static void main(String[]args){
System.out.print("请输入需要分解质因数的数:");
Scanner x=new Scanner(System.in);
int n=x.nextInt();
int k=2;
ArrayList<Integer> factor=new ArrayList<Integer>();
while(k!=n){
if(n%k==0){
n=n/k;
factor.add(k);
}else k++;
}
factor.add(n);
int length=factor.size();
System.out.print("此数的因质数为:");
for(int i=0;i<(length-1);i++){
System.out.print(factor.get(i)+"*");
}
System.out.print(factor.get(length-1));
}
}
5.题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
import java.util.*;
public class Grade {
public static void main(String[] args) {
int x;
char grade;
Scanner s = new Scanner(System.in);
System.out.print( "请输入一个成绩: ");
x = s.nextInt();
//三元运算符 (条件表达式)?表达式1:表达式2
//这里是(条件表达式)?表达式1:(条件表达式)?表达式2:表达式3————嵌套的三元运算符
grade = x >= 90 ? 'A' : x >= 60 ? 'B':'C';
System.out.println("等级为:"+grade);
}
}