java举一反三练习题

第15题思路也是借用scandf的,这些题目是过程提高题

全部都是带包编译,编译命令

javac i-nd g. XXX.java

运行命令

java demo.XXX

1.n有一对兔子,从命令出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

package demo;
/**
    * 1.有一对兔子,从出生后第3个月起每个月都生一对兔子,
    *   小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,
    *   问每个月的兔子总数为多少?
​
    */
    /*
    所有兔子成长规律:兔子生出来的第一个月不生兔子,第二个月不生兔子,第三个月起每个月都生兔子 也就是112规律
    也就是说前面两个月休整。第三个月的兔子数量是前面两个月数量的总和。即Fibonacci数列
    */
​
public class Test01{
    
    public static void main(String[] args){
        
        java.util.Scanner sc = new java.util.Scanner(System.in);
        System.out.println("请输入多少个月:");
        int number = sc.nextInt();
​
        //输出1-N项的斐波那契数列
        for (int i = 1;i <= number ;++i ){
            System.out.print(Fibonacci(i)+"\t");
            if (i%10 == 0){//如果超过10个数就换行,和题目逻辑无关
                System.out.println();
            }
        }
        
    }
    
    //给一个整数N,返回斐波那契数列的第N项
    public static int Fibonacci(int number){
        //第一种方法
        int temp = 1;//定义返回值
        if (number>2){
            temp = Fibonacci(number-1)+Fibonacci(number-2);
        }
        return temp;
    }
}

2.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

package demo;
/**
    * 2.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
    * 分析:找到一个最小质因数就输出
    * 就好像剥洋葱
    */
​
import java.util.Scanner;
public class Test02{
​
    public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入数字:");
            int number = sc.nextInt();
            System.out.print(number+"="); // 进行前半部分的打印
            
            // 做出判断循环
            for(int i=2;i<=number;i++) {
                while(number!=i) {//当number和i相等,就说明此时的i就是最后的一个质因子
                    if(number%i==0) {
                        System.out.print(i+"*");
                        number=number/i;//每输出一个质因子,number就剥掉一层
                    }else{
                        break;
                    }
                }
            }
            
            //输出最后的一个质因子
            System.out.println(number); // 表示打印出的是最後一个数
            
            
        }
    
}

3.输入两个正整数m和n,求其最大公约数和最小公倍数。

package demo;
/**
    * 3.输入两个正整数m和n,求其最大公约数和最小公倍数。
    */
    /*
        从m开始往下找i,能够被i整除m和n的就是最大公约数
        从m开始往上找,能够同时被m和n整除的就是最小公倍数
    */
public class Test03 {
​
    public static void main(String[] args) {
        //System.out.println("Hello World!");
        java.util.Scanner sc = new java.util.Scanner(System.in);
        System.out.println("请输入m:");
        int m = sc.nextInt();
        System.out.println("请输入n:");
        int n = sc.nextInt();
        function(m,n);
    }
​
    public static  void function(int m,int n){
​
        //从m开始往下找i,能够被i整除m和n的就是最大公约数
        for (int i = m;i >= 1 ;--i ){
            if (m%i == 0 && n % i == 0){
                System.out.println(m+"和"+n+"最大公约数为"+i);
                break;
            }
        }
        
        // 从m开始往上找,能够同时被m和n整除的就是最小公倍数
        for (int i = m;i <= m * n ;++i ){
            if (i%m==0 && i%n==0){
                System.out.println(m+"和"+n+"最小公倍数为"+i);
                break;
            }
        }
    }
}

4.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

package demo;
import java.util.Scanner;
/**
    * 4.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
    * 
    */
    /*
        分析:
        1,举一反三,从键盘随机获取字符,长度不等的函数
        2,统计英文字母个数
        3,统计空格个数
        4,统计数字个数
        5,统计其它字符个数
    */
​
public class Test04{
​
    public static void main(String[] args){
        
        System.out.println("随机生成一串字符...");
        char[] arrayChar = new char[getRandomNumber(1,20)];
        arrayChar = getRandomArray(arrayChar.length);//
        print(arrayChar);
        int[] arrayCount = countChar(arrayChar);
        System.out.println("英文字母个数\t"+arrayCount[0]);
        System.out.println("空格个数\t"+arrayCount[1]);
        System.out.println("数字个数\t"+arrayCount[2]);
        System.out.println("其它字符个数\t"+arrayCount[3]);
    }
    
    public static void print(char[] ch){
        for (int i = 0 ;i < ch.length ;++i ){
            System.out.print(ch[i]);
        }
        System.out.println();
    }
    //做成一个函数,返回一个长度为4的整型数组
    /*
        2,统计英文字母个数函数array[0]
        3,统计空格个数函数array[1]
        4,统计数字个数函数array[2]
        5,统计其它字符个数函数 array[3]
    */
    public static int[] countChar(char[] ch){
        int[] array = new int[4];
        for (int i = 0; i <ch.length ;++i ){
            if ((ch[i] >= 'a' && ch[i] <= 'z')||(ch[i] >= 'A' && ch[i] <= 'Z')){array[0]++;}
            else if (ch[i] == ' '){array[1]++;}
            else if (ch[i] >= '0' &&ch[i] <='9'){array[2]++;}
            else{array[3]++;}
        }
        return array;
​
    }
​
    //随机数组
​
    public static char[] getRandomArray(int n){
        char[] array = new char[n];
        for (int i = 0;i < n  ;++i ){
            array[i] = (char)getRandomNumber(32,127);
        }
        return array;
    }
​
    //随机数产生[m,n)
    public static int getRandomNumber(int m,int n){
        int temp = (int)(Math.random()*n);
        if(temp >= m && temp <= n );
        else{
            temp = getRandomNumber(m,n);
        }
        return temp;
    }
    
​
​
}

5.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

package demo;
​
/**
    *5.一球从100米高度自由落下,每次落地后反跳回原高度的一半;
    * 再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
    */
public class Test05{
​
    public static void main(String[] args){
        double h = 100;
        double s = h;
        for (int i = 2 ;i<= 10 ;++i ){
            s = s+ 2 * fn(h,i-1);
        }
        System.out.println(s);
        System.out.println(fn(100,10));
        
    }
    
    public static double fn(double h,int n){
        return h/fn1(n);
    }
​
    public static int fn1(int n){
        if (n==1)return 2;
        else return fn1(n-1)<<1;
    }
}

6.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

//6
/**
        * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数
        */
package demo;
public class Test06{
​
    public static void main(String[] args){
        int count = 0 ;
        int i,j,k;
        for(i = 1;i < 5;i++){//定义i是左边起第一位数字
            for(j = 1;j < 5;++j){
                for(k = 1;k < 5;++k){
                    if(k != i && k != j && i!=j){
                        System.out.print(""+i+j+k+"\t");
                        ++count;
                    }
                }
            }
            System.out.println();
        }
        System.out.println("一共有" + count + "个数字");
    }
}

7.输入某年某月某日,判断这一天是这一年的第几天?

/**
    * 输入某年某月某日,判断这一天是这一年的第几天?
    */
    /*
        分析:闰年2月只有28天,所以必须要有判断闰年的函数
            1,3,5,7,8,10,12大,共31天,可以用刺穿统计;
            闰年2月29天
            平年2月28天
            4,6,9,11都是30天
​
    */
​
package demo;
import java.util.Scanner;
public class Test07{
​
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年月日:");
        int year = sc.nextInt();
        int month = sc.nextInt();
        int day = sc.nextInt();
        System.out.println("第"+countDays(year,month,day)+"天");
    }
​
    //统计某天是这一年的第几天
    public static int countDays(int year,int month,int day){
        int sum = 0;
        switch (month-1){
            //case 12:{sum += 31;}
            case 11:{sum += 30;}
            case 10:{sum += 31;}
            case 9:{sum += 30;}
            case 8:{sum += 31;}
            case 7:{sum += 31;}
            case 6:{sum += 30;}
            case 5:{sum += 31;}
            case 4:{sum += 30;}
            case 3:{sum += 31;}
            case 2:{if (leapYear(year)){++sum;}else sum += 28;}
            case 1:{sum += 31;}
            default:System.out.println("这是正月呢");
        }
        return sum+day;
    }
​
    //判断闰年
    public static boolean leapYear(int year){
        boolean bool = false;
        if (year%4 == 0 && year%100 != 0){
            bool = true;
        }else if(year%100 == 0 && year%400 == 0){
            bool = true;
        }
        return bool;
    }
​
}

8.猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

/**
    * 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,
    * 又多吃了一个 第二天早上又将剩下的桃子吃掉一半,
    * 又多吃了一个。以后每天早上都吃了前一天剩下的一半
    * 零一个。到第10天早上想再吃时,见只剩下一个桃子了。
    * 求第一天共摘了多少。
    */
    /*
        分析:从最后一天往前推
        最后一天没有吃,也就是循环变量的次数是9
        1,(1+1)*2=4,(4+1)*2=10,(10+1)*2=22
    */
package demo;
public class Test08{
​
    public static void main(String [] args){
        int n = 1;//最后一天剩下一个
        for (int i = 9 ;i >0 ;--i ){
            n = (n+1)*2;
            System.out.println(n) ;
        }
        System.out.println("第一天一共摘了"+n+"个桃子。") ;
    
    }
​
}

9.两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

/**
	* 两个乒乓球队进行比赛,各出三人。
	* 甲队为a,b,c三人,乙队为x,y,z三人。
	* 已抽签决定比赛名单。有人向队员打听比赛的名单。
	* a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
	*/
package demo;
public class Test09{

	public static void main(String[] args){
		for (char i = 'a'; i <= 'c' ; ++i ){
			for (char j = 'x';j <= 'z' ;++j ){
				if((i=='a'&&j!='x')||((i=='c'&&j!='x')||(i=='c'&&j!='z'))){
				System.out.print(""+i+j+"\t");
				}
			}
		}
	}
}

10.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

/**
	* 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...
	* 求出这个数列的前20项之和。
	*/
package demo;
public class Test10{

	public static void main(String[] args){
		double sum = 0;
		for (int i = 0;i < 20 ;++i ){
			sum += (fibonacci(i+1)+1)/fibonacci(i+1);
		}
		System.out.println("sum="+sum);
	
	}

	public static double fibonacci(int n){
		double temp = 0;
		if (n ==0){
			temp = 1;
		}else if (n == 1){
			temp = 2;
		}else temp = fibonacci(n-1)+fibonacci(n-2);
		return temp;
	}
}

11.有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

/**
	* 有5个人坐在一起,问第五个人多少岁?
	* 他说比第4个人大2岁。问第4个人岁数,
	* 他说比第3个人大2岁。问第三个人,又
	* 说比第2人大两岁。问第2个人,说比第
	* 一个人大两岁。最后问第一个人,他说
	* 是10岁。请问第五个人多大?
	*/
package demo;
public class Test11{

	public static void main(String[] args){
		int year = 10;
		for (int i = 5;i>=2 ;--i ){
			year += 2;
		}
		System.out.println(year);
	}

}

12.给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

/**
	* 给一个不多于5位的正整数,要求:
	* 一、求它是几位数,
	* 二、逆序打印出各位数字。
	*/
package demo;
public class Test12{

	public static void main(String[] args){
		int number = getRandomNumber();
		print(number,count(number));
	}
	
	//求它是几位数
	public static int count(int number){
		System.out.println(number);
		int count = 0;
		do{
			++count;
			number /= 10;
		}
		while (number!=0);
		System.out.println("一共有"+count+"位");
		return count;
	}

	//逆序打印
	public static void print(int number,int count){
		do{
			int temp = number%10;
			number /= 10;
			System.out.print(temp);
			--count;
		}
		while (count>0);
	}

	//随机获取一个不多于5位的数
	public static int getRandomNumber(){
		return (int)(Math.random()*100000);
	}
}

13.求一个3*3矩阵对角线元素之和

/**
	* 求一个3*3矩阵对角线元素之和
	* 分析:3X3矩阵下角标之和如果是偶数的就是对角线
	*/
package demo;
public class Test13{
	
	public static void main(String[] args){
		int [][] array = getArray();
		int sum = sumArray(array);
		System.out.println("对角线的和为"+sum);
	}

	public static int sumArray(int[][] array){
		int sum = 0;
		for (int i = 0; i < 3 ;++i ){
			for (int j = 0;j < 3 ;++j ){
				if ((i+j)%2==0){
					sum += array[i][j];
				}
			}
			
		}
		return sum;
	}
	//获取一个3X3数组,排成矩阵
	public static int[][] getArray(){
		int[][] array = new int[3][3];
		for (int i = 0; i < 3 ;++i ){
			for (int j = 0;j < 3 ;++j ){
				array[i][j] = getRandomNumber();
				System.out.print(array[i][j]+"\t");
			}
			System.out.println();
		}
		return array;
	}
	//随机获取一个不多于2位的数
	public static int getRandomNumber(){
		return (int)(Math.random()*100);
	}
}

14.将一个数组逆序输出

/**
	* 将一个数组逆序输出
	*/
package demo;
public class Test14{
	
	public static void main(String [] args){
		int[] array = getArray();
		printArray(array);

	}

	//逆序输出数组
	public static void printArray(int[] array){
		System.out.println("数组正序输出:");
		for (int i = 0 ;i < array.length;++i){
			System.out.print(array[i]+"\t");
			if((i+1)%10 == 0)System.out.println();
		}
		System.out.println();
		System.out.println("数组逆序输出:");
		for (int i = 0 ;i < array.length;++i){
			System.out.print(array[array.length-i-1]+"\t");
			if((i+1)%10 == 0)System.out.println();
		}
	}

	//获得一个随机数组
	public static int[] getArray(){
		int[] array = new int[getRandomNumber()+1];
		
		for (int i = 0; i < array.length ;++i ){
			array[i] = getRandomNumber();
		}
		return array;
	}

	//随机获取一个不多于2位的数
	public static int getRandomNumber(){
		return (int)(Math.random()*100);
	}
}

15.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

/**
	* 有n个人围成一圈,顺序排号。
	* 从第一个人开始报数(从1到3报数),凡报
	* 到3的人退出圈子,问最后留下的是原来第几
	* 号的那位。
        * 这一题的思路不是我想的,来源https://www.cnblogs.com/doudoublog/p/5028761.html
	*/


package demo;
import java.util.Scanner;
public class Test15{
	public static void main(String [] args){
	Scanner sc =new Scanner(System.in);
	int n = sc.nextInt();
	int M = 3;
	int s =0;
	for (int i =2;i <= n ;++i ){
		s = (s+M)%i;
	}
		System.out.println("第"+(s+1)+"号");

	}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值