day3
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
public static int age(int n){
if (n == 1){
return 10; //递归函数的出口
}else{
return age(n - 1)+2; //函数递归调用函数本身
}
}
public static void main(String[] args) {
System.out.println("第五个人:"+age(5));
}
运行结果:
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第10个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21…
//使用递归
public static int count(int n){
if(n == 1 || n == 2){
return 1;
}else{
return count(n-2)+count(n-1); //递归
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入月份:");
int n = scanner.nextInt();
if (n < 1){
System.out.println("数据错误");
}else{
System.out.println("第"+n+"个月兔子总数:"+count(n)*2);
}
}
//使用循环而不用递归
public static void main(String[] args) {
// count1();
count2();
}
public static void count1(){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入查询月:");
int n = scanner.nextInt();
int[] array = new int[12];
for (int i = 1; i <=12 ; i++) {
if (i == 1 || i == 2) {
array[i-1] = 1;
}else {
array[i-1] = array[i-3] + array[i-2];
}
}
System.out.println("第"+n+"个月的兔子总数:"+array[n-1]*2);
}
private static void count2() {
int a = 0; //上上的月
int b = 0; //上个月
int now = 0; //当前月
for (int i = 1; i <= 10; i++) {
if (i == 1 || i == 2 ) {//1月和2月
now = 1;
a = 1;
b = 1;
}else { //从第三个月开始
now = a + b; //前两个月的和
a = b;
b = now;
}
}
System.out.println("第10个月的兔子:"+ now*2);
}
运行结果:
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后的结果满足完全平方数 , 则输出该数
public static void main(String[] args) {
int x;
for (int i = 0; i <10*10000 ; i++) {
// 判断数据是否为完全平方数
if ( Math.sqrt(i + 100) % 1 == 0 && Math.sqrt(i + 100+ 168 ) % 1 == 0){
System.out.println("符合"+i);
}
}
}
运行结果:
九九乘法表
– 双重for循环:外层循环控制行数(9行),内层循环控制每行的列数(1,2,3,…9)
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {//外层循环控制行数
for (int j = 1; j <= i ; j++) {//内层循环控制每行的列数(i从1,2,3逐渐变化到9)
System.out.print(j + "*" + i + "="+i*j+"\t");
}
System.out.println();
}
}
运行结果:
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
//素数: 只能被1和本身整除的数据是素数
public static void main(String[] args) {
int num = 0;
for (int a = 101; a <=200 ; a++) {
boolean flag = true;//表示是素数
for ( int i = 2 ;i <=Math.sqrt(a); i++) {// i <=Math.sqrt(a) : 减少for循环的次数
if (a % i == 0) {
flag = false; // 不是素数
break;
}
}
if (flag) {
System.out.println(a + "是素数");
num++;
}
}
System.out.println("素数的总数:"+num);
}
运行结果:
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
public static void main(String[] args) {
for (int num = 1; num <= 1000; num++) {
int sum = 0;
String str = "";
for (int i = 1; i < num; i++) {
if (num % i == 0) {//能除
sum = sum + i;
if (i == 1){
str = str + i;
}else{
str = str + "+" + i ;
}
}
}
if (num == sum){
System.out.println(num+"是完数:"+num+"="+str);
}
}
}
运行结果:
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
public static void main(String[] args) {
int x = 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 && i != k) {
// System.out.println("" + i + j + k);
// }
if (i == j || j == k || i == k) {
continue;
}
System.out.println("" + i + j + k);
}
}
}
}
运行结果:
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。从键盘输入一个四位数,然后输出加密之后数据
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个4位数:");
int num = scanner.nextInt();
int[] arr = new int[4];
arr[0] = num /1000;//千
arr[1] = num /100%10;//百
arr[2] = num /10 % 10;//十
arr[3] = num % 10;//个
// 加5,和除以10代替
for (int i = 0; i <=3 ; i++) {
arr[i] = (arr[i]+5)%10;
// System.out.println(arr[i]);
}
// 1、4,交换
int temp = 0;
temp = arr[0];
arr[0] = arr[3];
arr[3] = temp;
// 2、3交换
temp = arr[1];
arr[1] = arr[2];
arr[2] = temp;
System.out.print("加密数据为:");
for (int i = 0; i <arr.length; i++) {
System.out.print(+arr[i]);
}
}
运行结果: