1.一只兔子,从出生后第三个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假设兔子不是死亡,每个月兔子有多少只(斐波拉契数列)
分析:起始兔子为一只,从第三个月起,每个月都新增一只,则第1个月到第i个月兔子数依次为1,1,2,3,5,…f(i-2),f(i-1),f(i),发现第一个月和第二个月兔子数都为1,从第3个月起,有f(i)=f(i-1)+f(i-2),表示第i个月的兔子数等于第i-1个月的兔子数加上第i-2个月的兔子数。
此题转化为当给定mon个月,即求第一个月到mon个月中,每个月的兔子数;使用for循环遍历第1个月到第i个月,使用if else分支结构来根据i求f(i)。
import java.util.Scanner;
public class MonthNumber{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("输入月数:");
int mon = sc.nextInt(); //mon表示总共有mon个月
int i=1;//i表示第i个月,i=1表示第1个月
int a=0,b=0,c=0;//a表示第i-2个月兔子数,b表示第i-1个月兔子数,c表示第i个月兔子数
//每循环一次求出这个月的兔子数
for(;i<=mon;i++){
if(i<3){
a=1;
b=1;
//这里分别定义第一个月和第二月的兔子数,是为了在else中利用f(i)=f(i-1)+f(i-2)依次求出f(3),f(4)
System.out.println("第"+i+"个月有"+1+"只兔子");
}else{
c=a+b;//第i个月兔子数c=f(i)=f(i-2)+f(i-1);
System.out.println("第"+i+"个月有"+c+"只兔子");
a=b; //将上一轮循环中的f(i-1)赋给当前循环中的f(i-2)
b=c; //将上一轮循环中的f(i)赋给当前循环中的f(i-1)
}
}
}
}
2.判断101-200之间有多少个素数,并输出所有的素数
输出所有素数:依次取101-200中的所有数,取一个数就判断这个数是否为素数,即判断该数是否能被1和其本身之外的所有数整除,所以外层循环遍历101-200之间所有数,内层遍历除1和其本身之外的所有数;内层遍历时,当出现一次能整除的情况,则该数不是素数,遍历余下的数已无意义,需跳出整个内层循环,进行下一次外层循环,且不能输出当前外层循环中的非素数,当前内层循环中没有出现能整除的情况时继续内层遍历直至将内层遍历完,内层循环中一次都没整除时,需在本次外层循环中输出这个素数,所以在外层循环中是否输出这个数,取决于该数在内层循环中是否被整除了,被整除了,则不能再外层循环中输出这个数,当一次都没有被整除,就输出这个素数,所以在外层循环的外层初始化一个状态,当在内层循环中被整除了,就设置另一个状态,然后在根据该状态,来判断该数是否为素数并输出这个数。
输出多少个:在外层循环中出现一个素数,就用一个变量去记录一次,不出现就不记录,整个外层遍历完了,输出这个值
public class PriNum{
public static void main(String[] args){
int num = 0; //num表示素数的个数
for(int i =101;i<=200;i++){
boolean isPrime = true; //true表示是素数
//判断i是否为素数
for(int j =2;j<=i-1;j++){
if(i%j==0){
isPrime = false; //表示i不是素数
break;
}
}
//根据该数是否为素数来决定是否输出该数
if(isPrime){
num=num+1;
System.out.print(i+" ");
}
}
System.out.print("\n101-200之间有"+num+"个素数");
}
}