第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)+"号");
}
}