Java基础题50(已全部更新完成)

目录见左边广告之下,涉及到的常用功能函数

1、兔子繁殖问题

package woniu.java50;

import java.util.Scanner;

/*Java50例题
 * 1、兔子繁殖问题--斐波那契数列
 * 条件:1对兔子出生第3个月后开始繁殖,2月后一月一次1对,不死
 * 分析兔子的对数呈现为:1、1、2、3、5、8、13、21*/
public class T_1_tuzi {	
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入兔子繁殖的时间(单位:月,类型整数):");
		int month = scanner.nextInt();
		while (month <= 0) {
			System.out.println("输入不合法,请重新输入:");
			month = scanner.nextInt();
		}
		int pre = fanzhi(month);
		System.out.println(month+"个月后,兔子的对数为:"+pre+"对");
		scanner.close();
	}

	private static int fanzhi(int month) {
		// TODO Auto-generated method stub
		int pre_1=1,pre_2=1;
		int pre_n = 0;
		if (month ==1 || month ==2) {
			pre_n = 1;
		}else {
			for (int i = 3; i <= month; i++) {
				pre_n = pre_1+pre_2;
				pre_1 = pre_2;
				pre_2 = pre_n;
			}
		}
		return pre_n;
	}
}

2、101-200之间的素数

package woniu.java50;

/*判断101-200之间有多少个素数,并输出所有素数
 *素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数
 * */
public class T_2_shusu {
	
	public static void main(String[] args) {
		int s=0;//素数个数
		for (int i = 101; i < 201; i++) {
			int k = 0;
			int data[] = new int[30];//定义一个数组,长度为20
//			判断素数并存入数组
			for (int j = 1; j <= i; j++) {								
				if (i%j == 0) {
					while (true) {
						data[k] = j;
						k++;
//						跳出while循环
						break;
					}
				}
			}
//			查看数组元素
/*
 * System.out.println(i+"的因数数组为:"); for (int j = 0; j < k; j++)
 * System.out.print(data[j]+" "); System.out.println();
 */
//			判断素数
			if (k == 2) {
				System.out.println(i+"是素数");
				s++;
//				查看因数数组
				/*
				 * for (int j = 0; j < k; j++) System.out.print(data[j]+" ");
				 * System.out.println();
				 */		
			}
		}
		System.out.println("101--200之间一共有"+s+"个素数");
	}
}

3、水仙花

package woniu.java50;
/**
 * 3、打印水仙花数
 * @author 26307
 *水仙花数:3位数,其每一位数的立方和等于其本身
 *范围:100-999
 */
public class T_3_shuixianhuashu {
	
	public static void main(String[] args) {
		for (int i = 100; i < 1000; i++) {
			panduan(i);
		}
	}
	
	private static void panduan(int num) {
		// TODO Auto-generated method stub
		int bai = num/100; //百位数
		int shi = num/10%10; //十位数
		int ge = num%10; //个位数
		if (num == bai*bai*bai + shi*shi*shi + ge*ge*ge) {
			System.out.println(num+"是水仙花数!");
		}
	}
}

4、正整数分解成质因数

package woniu.java50;

import java.util.Scanner;

/**
 * 将一个正整数分解质因数
 * @author 26307
 *eg:90=2*3*3*5
 *条件:
 *1、可以被整除,除数是素数
 *2、循环除,直到成为一个素数
 *素数:只有1和本身两个因子
 *不是:奇数1、偶数(2除外)
 *
 */
public class T_4_zhishu {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个正整数:");
		int num = scanner.nextInt();
		int a = num;
		while (num < 0) {
			System.err.println("您输入的是负数,请重新输入一个正整数:");
			num = scanner.nextInt();
			a = num;
		}
		int[] arr = new int[11];
		int key = 0;
		for (int i = 2; i <= num; i++) {
			if (num%i==0 && sushu(i)) {
				num = num/i;
				arr[key] = i;
				key++;
				i = 1;
			}
		}
//		输入的整数为1或者为素数
		if (a==1 || sushu(a)) {
			System.out.println(a+" = "+ a + " * "+" 1 ");
//			退出程序
			System.exit(0);
		}
//		规范输出
		System.out.print(a+" = ");
		for (int i = 0; i < key; i++) {
//			输出前面的质因数
			if (i< key-1) {
				System.out.print(arr[i]+" * ");
//				结束当前循环进入下次循环
				continue;
			}
//			最后一个质因数
			if (i == key-1) {
				System.out.print(arr[i]);
			}
		}
		scanner.close();
	}
	
//	判断素数
	@SuppressWarnings("unused")
	public static boolean sushu(int num) {
		// TODO Auto-generated method stub	
		if (num==2 ) {
//			System.out.println(num+"是素数!");
			return true;
//			排除偶数和1(素数必须>0)
		}else if (num%2==0 || num < 2) {
//			System.out.println(num+"不是素数!");
			return false;
		}else {
//			定理: 如果n不是素数, 则n有满足1< d<=sqrt(n)的一个因子d.
//          证明: 如果n不是素数, 则由定义n有一个因子d满足1< d< n.	
			for (int i = 3; i*i <= num; i += 2) {
//				i+=2:排除偶数
				if (num%i == 0) {
//					System.out.println(num+"不是素数!");
					return false;
				}
//				System.out.println(num+"是素数!");
				return true;
			}
		}
//		System.out.println(num+"是素数!");
		return true;
	}
}

4、简化版本(原网址:java基础50题_Purnell的博客-CSDN博客

package woniu.java50;
/**
 * 不用考虑素数,在方法f中已经规避了对素数的判定
 */
import java.util.Scanner;

public class T_4_primeNum {
	
	public static int f(int n) {
		for (int i = 2; i < n; i++) {
			if (n%i==0 && n!=i) {
				System.out.print(i+" * ");
				return f(n/i);
			}
		}
		System.out.print(n);
		return n;
	}
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个正整数:");
		int n = scanner.nextInt();
		System.out.print(n+" = ");
		f(n);
		scanner.close();
	}
}

5、给成绩分等级

package woniu.java50;

import java.util.Scanner;

/**
 * 给输入的成绩分等级
 * @author 26307
 *A:>=90
 *B:89-60
 *C:<60
 *Java默认整除
 */
public class T_5_score {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入您的分数(0~100):");
		int score = scanner.nextInt();
		while (score>100 || score<0) {
			System.err.println("输入错误,请重新输入百分制的分数:");
			score = scanner.nextInt();
		}
		switch (score/30) {
		case 1:
		case 0:
			System.out.println("您的等级是C");
			break;
		case 2:
			System.out.println("您的等级是B");
			break;
		case 3:
			System.out.println("您的等级是D");
			break;
		default:
			break;
		}
		scanner.close();
	}
}

6、最大公约数和公倍数

package woniu.java50;

import java.util.Scanner;

/**
 * 输入两个正整数找到他们最大公约数和最小公倍数
 * @author 26307
 *公约数:整除两个整数的最大正整数common divisor
 *公倍数:2个整数的共有倍数(第一个可以整除两个整数的正整数)Common multiple
 */
public class T_6_mathBeiUYue {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入两个整数:");
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		while (a<=0 || b<=0) {
			if (a<=0) {
				System.err.println("第一个数输入错误,请重新输入一个正整数:");
				a = scanner.nextInt();
			}
			if (b<=0) {
				System.err.println("第二个数输入错误,请重新输入一个正整数:");
				b = scanner.nextInt();
			}
		}
		int min = commonMultipleMin(a, b);
		int max = commonDivisorMax(a, b);
		System.out.println(a+"和"+b+"的最小公倍数是:"+min+",最大公约数是:"+max);
		scanner.close();
	}
	
//最小公倍数Common multiple
	public static int commonMultipleMin(int a,int b) {
		int max = a>b?a:b;
		int min = max;
		for (int i = max; i <= a*b; i++) {
			if (i%a==0 && i%b==0) {
				min = i;
				break;
			}
		}
		return min;
	}
	
//	最大公约数common divisor
	public static int commonDivisorMax(int a,int b) {
		int min = a<b?a:b;
		int max = 1;
		for (int i = 2; i < min; i++) {
			if (a%i==0 && b%i==0) {
				max = max>i?max:i;
			}
		}
		return max;
	}
}

7、字符统计

package woniu.java50;

import java.util.Scanner;

/*统计字符个数
 * 描述:输出一行字符,分别统计其英文字母、空格、数字和其他字符的个数
 * charAt():
 * */
public class T_7_characterStatistical {
//	函数中的void表示return返回的数据类型,其中void表示空
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一行字符串,回车结束输入:");
		String str = scanner.nextLine();
		tongji(str);
		scanner.close();
	}
	private static void tongji(String str) {
		int china = 0;
		int english = 0;
		int number = 0;
		int blank = 0;
		int other = 0;
		for (int i = 0; i < str.length(); i++) {
//			缓存字符
			char ch = str.charAt(i);
//			Unicode表中:中文基础范围:'\u4E00'--'\u9FA5
			if (ch >= '\u4E00' && ch <= '\u9FA5') {
				china++;
			}
//			统计英文字母
			else if (ch >= 'a' && ch <= 'z'||ch >= 'A' && ch <= 'Z') {
				english++;
//			数字
			}else if (ch >= '0' && ch <= '9') {
				number++;
//			空格,ASCII码为32
			}else if (ch == ' ') {
				blank++;
//			其他
			}else {
				other++;
			}
		}
		System.out.println("中文字符有:"+china+"个,英文字母有:"+english+"个,数字有:"+number+"个,空格有:"+blank+"个,其他字符有:"+other+"个");
		return;	
	}
}

8、求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字

package woniu.java50;

import java.util.Scanner;

/**
 * 求解:s = a + aa + aaa + aaaa + aaaaa + ???
 * 加多少由用户设定
 * @author 26307
 *
 */
public class T_8_sum5 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个整数(1-9):");
		int num = scanner.nextInt();
		while (num <= 0 || num > 9 ) {
			System.err.println("第一个数输入错误,请重新输入1-9内的一个整数:");
			num = scanner.nextInt();
		}
		System.out.println("请输入需要相加的数的最大位数(不超过9):");
		int n = scanner.nextInt();
		while ( n<= 0 || n>9) {
			System.err.println("第二个数输入错误,请重新输入1-9内的一个整数:");
			n = scanner.nextInt();
		}
		System.out.println(sum(num,n));
		scanner.close();
	}
	
	public static int sum(int a,int b) {
		int s = 0;
		int result = 0;
		System.out.print("s = ");
		for (int i = 0; i < b; i++) {
			s = s * 10 + a;
			result += s;
			if (i<b-1) {
				System.out.print(s+" + ");
				continue;
			}
			System.out.println(s);
			System.out.print("  = ");
		}
		return result;
	}
}

随机版

package woniu.java50;

import MyShortcuts.Random;

/**
 * 求解:s = a + aa + aaa + aaaa + aaaaa + ???
 * 加多少由随机设定
 * @author 26307
 *
 */
public class T_8_randomSum {
	
	public static void main(String[] args) {
		int num = Random.randomNuber(1, 9);
		System.out.println("初始数据是:"+num);
		int n = Random.randomNumber(1, 9);
		System.out.println("最大位数是:"+n);
		System.out.println(sum(num,n));
	}
	
	public static int sum(int a,int b) {
		int s = 0;
		int result = 0;
		System.out.print("s = ");
		for (int i = 0; i < b; i++) {
			s = s * 10 + a;
			result += s;
			if (i<b-1) {
				System.out.print(s+" + ");
				continue;
			}
			System.out.println(s);
			System.out.print("  = ");
		}
		return result;
	}
}

随机函数

package MyShortcuts;
/**
 * 随机生成指定范围的一个随机整数
 * @author 26307
 *
 */
public class Random {
//	随机一个数在指定范围内[a,b],a<b
//	调用eg : Random.randomNuber(11, 30)
	public static int randomNuber (int a,int b) {
//		向上取整:范围会变小,即[a,b]-->[a+1,b]
//		向下取整
		int num = (int)Math.floor(Math.random()*(b-a+1)+a); 
		return num;
	}
}

9、完数

package woniu.java50;
/**
 *描述:
 *一个数如果恰好等于它的因子之和,这个数就称为”完数”。
 *例如6=1+2+3.编程 找出1000以内的所有完数
 * @author 26307
 *求因子:可以整除
 *求和:数组长度未知,相加,求和
 */
public class T_9_wanMeiShu {

	public static void main(String[] args) {
		for (int i = 1; i < 1000; i++) {
			if (i == sum(yinzi(i))) {
				show(i, yinzi(i));
			}
		}
	}
//	求因子
	public static int[] yinzi(int a) {
//		1000以内因子最多的是840,有32个因子(包含840)
		int[] arr = new int[31];
		int k = 0;
		for (int i = 1; i < a; i++) {
//			数组未赋值时存储的数据是0
			if (a%i==0) {
				arr[k] = i;
				k++;
			}
		}
		return arr;
	}
//	求和
	public static int sum(int[] a) {
		int s = 0;
		for (int i = 0; i < a.length; i++) {
			if (a[i]==0) {
				break;
			}
			s += a[i];
		}
		return s;
	}
//	输出因子
	public static void show(int a,int[] b) {
		System.out.print(a+" = ");
		for (int i = 0; i < b.length; i++) {
			if (b[i+1]==0) {
				System.out.print(b[i]);
				break;
			}
//			if (i!=0 && i%6==0) {
//				System.out.println();
//				System.out.print("   ");
//			}
			System.out.print(b[i]+" + ");
		}
		System.out.println();
	}
}

10、球落地反弹

package woniu.java50;

import java.util.Scanner;

/**题目描述:
 * 一球从100米高度自由落下,每次落地后反跳回原高度的一半;
 * 再落下,求它在 第10次落地时,共经过多少米?
 * 第10次反弹多高?
 * @author 26307
 * 解决思路:
 * 1、h = h * 0.5,float
 * 2、函数调用本身
 */
public class T_10_qiuFanTan {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入初始高度(单位:米,>=1):");
		float h = scanner.nextFloat();
		while (h < 1.0F) {
			System.err.println("输入错误,请重新输入初始高度(单位:米,>1):");
			h = scanner.nextFloat();
		}
		System.out.println("请输入反弹次数(>=1):");
		int n = scanner.nextInt();
		while (n < 1) {
			System.err.println("输入错误,请重新输入弹跳次数:");
			n = scanner.nextInt();
		}
		System.out.println("初始高度为"+h+"米时,第"+n+"次反弹高度是:"+tanQiu(h, n)+"米");
		scanner.close();
	}
//	弹球
	public static float tanQiu(float h,int n) {
		h = h/2.0F;
		n--;
//		System.out.println("n="+n+", h="+h);
//		省略for循环
		if (n>0) {
			return tanQiu(h, n);
		}else {
			return h;
		}
	}
}

11、1~4组成3位数

package woniu.java50;
/**题目:
 * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?
 * 都是多少?
 * 
 * @author 26307
 *解析:
 *4个数字1-4,3位数:3层for循环
 */
public class T_11_numberZuHe {

	public static void main(String[] args) {
		int n = 1;
		for (int i = 1; i < 5; i++) {
			for (int j = 1; j < 5; j++) {
				for (int j2 = 1; j2 < 5; j2++) {
					if (i==j || i==j2 || j==j2) {
						continue;
					}else {
						System.out.println("第"+n+"个三位数是:"+i+j+j2);
						n++;
					}
				}
			}
		}
	}
}

12、利润提成

package woniu.java50;

import java.util.Scanner;

/**题目:
 * 企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;
 * 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,
 * 高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,
 * 可提成5%;40万到60万之间时高于40万元的部分,可提成3%;
 * 60万到100万之间时,高于60万元的部分,可提成1.5%,
 * 高于100万元时,超过100万元的部分按1%提成,
 * 从键盘输入当月利润I,求应发放奖金总数?
 * 
 * @author 26307
 *解析:
 *1、用户输入利润
 *2、根据利润判断得到奖金
 *利润提成区间
 *1、lr<=10w     0.1     lr*0.1  1
 *2  10w<lr<=20W 0.075  (lr-10)*0.075+1  1+0.75
 *3  20W<lr<=40w 0.05   (lr-20)*0.05+1.75 1.75+1
 *4  40W<lr<=60w 0.03   (lr-40)*0.03+2.75 2.75+0.6
 *5  60W<lr<=100w 0.015   (lr-60)*0.015+3.35 3.35+0.6
 *6  100W<lr  0.01   (lr-100)*0.01+3.95 
 *拓展:
 *利润精确到6位小数
 */
public class T_12_tiChen {

	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入本月利润(单位:万元):");
		float lr = scanner.nextFloat();
		while (lr<=0F) {
			System.err.println("利润不能为负数,请重新输入(单位:万元):");
			lr = scanner.nextFloat();
		}
		System.out.println("本月利润为"+lr+"万元,应发奖金"+tc(lr)+"万元");
		scanner.close();
	}
//	提成
	public static float tc(Float lr) {
		float jiangJin = 0F;
//		100W<lr  0.01   (lr-100)*0.01+3.95 
		if (lr>100F) {
			jiangJin = (lr-100F) * 0.01F + 3.95F;
		}
//		60W<lr<=100w 0.015   (lr-60)*0.015+3.35 3.35+0.6
		if (lr>60F) {
			jiangJin = (lr-60F)*0.015F+3.35F;
		}
//		40W<lr<=60w 0.03   (lr-40)*0.03+2.75 2.75+0.6
		if (lr>40F) {
			jiangJin = (lr-40F)*0.03F+2.75F;
		}
//		20W<lr<=40w 0.05   (lr-20)*0.05+1.75 1.75+1
		if (lr>20F) {
			jiangJin = (lr-20F)*0.05F+1.75F;
		}
//		10w<lr<=20W 0.075  (lr-10)*0.075+1  1+0.75
		if (lr>10F) {
			jiangJin = (lr-10F)*0.075F+1F;
		}
//		lr<=10w     0.1     lr*0.1  1
		if (lr<10F) {
			jiangJin = lr * 0.1F;
		}
		return jiangJin;
	}
}

13、完全平方数

package woniu.java50;
/**题目:
 * 一个整数,它加上100后是一个完全平方数,
 * 再加上168又是一个完全平方数,请问该数是多少?
 * @author 26307
 *解析:
 *使用数学方法:math.sqrt()开平方
 *回答:在int类型范围类只有3个满足该条件的数,即:21 261 1581
 */
public class T_13_sqrt {

	public static void main(String[] args) {
		int number = 1;
//		死循环,结束条件:得到三个满足条件的数
		for (int i = 1;; i++) {
			if (number > 3) {
//				程序停止
				System.exit(0);
			}
			if (isSqrt(i)) {
				System.out.println("第"+number+"个满足条件的数是:"+i);
				number++;
			}
		}
	}
	
	public static boolean isSqrt(int n) {
		boolean result = false;
		int n1 = n+100;
		int n2 = n+268;
		int x = (int)Math.sqrt(n1);
		int y = (int)Math.sqrt(n2);
		if (x*x == n1 && y*y == n2) {
			result = true;
		}
		return result;
	}		
}

14、根据日期判断是这年的哪一天

package woniu.java50;

import java.util.Scanner;

/**
 * 题目:输入某年某月某日,判断这一天是这一年的第几天?
 * @author 26307
 * 分析:
 * 闰年:366天  2月29天
 * 平年:365天  2月28天
 * 31天: 1 3 5 7 8 10 12
 * 30天: 4 6 9 11
 * 函数:
 * 1、判断闰年
 *  1)可以被4,但是不能被100整除
 *  2)可以被400整除
 * 2、得到天数
 */
public class T_14_timeYearMonthDay {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入年份:");
		int year = scanner.nextInt();
		System.out.println("请输入月份:");
		int mouth = scanner.nextInt();
		System.out.println("请输入号数:");
		int day = scanner.nextInt();
		int dayNumber = dayNumber(year, mouth, day);
		System.out.println(year+"年"+mouth+"月"+day+"日是"+year+"年200的第"+dayNumber+"天");
		scanner.close();
	}
//	判断闰年:
	public static boolean runYear(int year) {
		boolean result = false;
		if ((year%4==0 && year%100!=0) || year%400==0) {
			result = true;
			System.out.println(year+"是闰年");
		}else {
			System.out.println(year+"不是闰年");
		}
		return result;
	}
//	得到天数
	public static int dayNumber(int year, int mouth,int day) {
		int number = 0;
		if (runYear(year) && mouth>2) {
			number++;
		}
		switch (mouth) {
		case 1:
			number += day;
			break;
		case 2:
			number += day+31;
			break;
		case 3:
			number += day+31+28;
			break;
		case 4:
			number += day+31+28+31;
			break;
		case 5:
			number += day+31+28+31+30;
			break;
		case 6:
			number += day+31+28+31+30+31;
			break;
		case 7:
			number += day+31+28+31+30+31+30;
			break;
		case 8:
			number += day+31+28+31+30+31+30+31;
			break;
		case 9:
			number += day+31+28+31+30+31+30+31+31;
			break;
		case 10:
			number += day+31+28+31+30+31+30+31+31+30;
			break;
		case 11:
			number += day+31+28+31+30+31+30+31+31+30+31;
			break;
		case 12:
			number += day+31+28+31+30+31+30+31+31+30+31+30;
			break;
		default:
			break;
		}
		return number;
	}
}

15、3个整数比较大小

package woniu.java50;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 题目:输入三个整数x,y,z,请把这三个数由小到大输出。
 * @author 26307
 *
 */
public class T_15_shuZiDaXiao {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[] arr = new int[3];
//		System.out.println("请输入3个整数(空格相隔,回车结束):");
//		arr[0] = scanner.nextInt();
//		arr[1] = scanner.nextInt();
//		arr[2] = scanner.nextInt();
		for (int i = 0; i < arr.length; i++) {
			System.out.println("请输入第"+(i+1)+"个整数");
			arr[i] = scanner.nextInt();
		}
		int[] arr2 = paiXu(arr);
		System.out.println(Arrays.toString(arr2));
		scanner.close();
	}
//	排序
	public static int[] paiXu(int[] arr) {
//		比较轮数
		for (int i = 0; i < arr.length-1; i++) {
//			比较,升序
			for (int j = 0; j < arr.length-i-1; j++) {
				if (arr[j] > arr[j+1]) {
					int max = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = max;
				}
			}
		}
		return arr;
	}
}

16、乘法表

package woniu.java50;
/**
 * 输出9*9口诀
 * @author 26307
 *
 */
public class T_16_99chengFa {
	public static void main(String[] args) {
		for (int i = 1; i < 10; i++) {
			for (int j = 1; j < i+1; j++) {
				System.out.print(i+" * "+j+" = "+(i*j));
				System.out.print("  ");
			}
			System.out.println();
		}
	}
}

17、猴子吃桃子

package woniu.java50;
/**题目:
 * 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,
 * 还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,
 * 又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
 * 到第10天早上想再吃时,见只剩下一个桃子了。
 * 求第一天共摘了多少。
 * @author 26307
 * 分析:
 * 10天剩下1个
 * 9:(1+1)*2 = n
 * 。。。:(n+1)*2
 */
public class T_17_houZiChiTao {

	public static void main(String[] args) {
		int n = 1;
		for (int i = 10; i > 0; i--) {
			System.out.println("第"+i+"天桃子数量为:"+n);
			n = (n+1)*2;
		}
	}
}

18、比赛名单

package woniu.java50;

/**
 * 题目描述;
 * 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
 * 已抽签决定比赛名单。有人向队员打听比赛的名单。
 * a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
 * @author 26307
 *分析;
 *使用数组进行分组
 *条件:a不和x比赛,c不和x\z比赛-即c只能和y比赛-a、b不能和y比赛
 *
 *分析结果:a-z c-y b-x
 */
public class T_18_abcPKxyz {

	public static void main(String[] args) {
		String[] A = {"a","b","c"};
		String[] B = {"x","y","z"};
		String[][] pk = new String[3][2];
		for (int i = 0; i < A.length; i++) {
			for (int j = 0; j < B.length; j++) {
				if ((A[i] =="a" && B[j] == "x") || (A[i] =="a" && B[j] == "y")) {
					continue;
				}else if ((A[i] == "c" && B[j]=="x") || (A[i] == "c" && B[j]=="z")) {
					continue;
				}else if ((A[i] =="b" && B[j] == pk[0][1])||(A[i] =="b" && B[j] == "y")) {
					continue;
				}else {
					pk[i][0] = A[i];
					pk[i][1] = B[j];
				}
			}
		}
		System.out.println("比赛名单:");
		for (int i = 0; i < pk.length; i++) {
			System.out.println("第"+(i+1)+"组:"+pk[i][0]+" pk "+pk[i][1]);
		}
	}
}

19、菱形

package woniu.java50;

import java.util.Scanner;

/**
 * 题目:打印菱形
 * @author 26307
 *分析:菱形
 *行数h必须为奇数,列数l由行数决定
 *最大列数l=h
 *中间行:zh = h/2 +1(整除)
 *1<= h <= zh,即中间行以上:l = 2*h -1
 *hmax>= h >= zh,即中间行以下:l = 2*(h-2(h-zh))-1=2(2*zh-h)-1
 */
public class T_19_lingxing {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int h = 1;
		System.out.println("请输入菱形的对角线长度:(默认为1)");
		h = scanner.nextInt();
		while (h<1 || h%2 == 0) {
			System.err.println("输入错误!对角线长度必须为大于0的奇数,请重新输入:");
			h = scanner.nextInt();
		}
		System.out.println("---------打印菱形-----------");
		lingXing(h);
		scanner.close();
	}
	
	private static void lingXing(int h) {
		int zh = h/2 +1;
		for (int i = 0; i <= h; i++) {
			if (i <= zh) {
				for (int j = 0; j < zh-i; j++) {
					System.out.print("  ");
				}
				for (int j = 0; j < 2*i-1; j++) {
					System.out.print(" *");
				}
			}else {
				for (int j = 0; j < i-zh; j++) {
					System.out.print("  ");
				}
				for (int j = 0; j < 2*(2*zh-i)-1; j++) {
					System.out.print(" *");
				}
			}
			System.out.println();
		}
	}
}

20、分数相加(后面运行数度很慢,数值很大)

package woniu.java50;

import java.util.Arrays;

/**
 * 题目:
 * 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
 * @author 26307
 *分析:
 *分子:2 3 5 8 13 *** :规律:从第三个数开始,一个数等于前两个数之和
 *分母:1 2 3 5 8 **** :规律:从第三个数开始,一个数等于前两个数之和
 *困难:分数相加   数值越界:int--long--double
 *解决:2个分子相加,在和第三个分子相加
 *
 *后面数字较大,加到第11个分数已经达到10位数
 */
public class T_20_fenShuJiaFa {

	public static void main(String[] args) {
		int[] a = new int[20];
		int[] b = new int[20];
		a = guiLv(2,3);
		b = guiLv(1,2);
		System.out.println("分子:"+Arrays.toString(a)+",长度"+a.length);
		System.out.println("分母:"+Arrays.toString(b)+",长度"+b.length);
		long[] result = new long[2];
		result = addFenShu((long)a[0], a[1], (long)b[0], b[1]);
		for (int i = 2; i < a.length; i++) {
			result = addFenShu(result[0], a[i], result[1], b[i]);
			System.out.println("前"+(i+1)+"个分数相加结果:"+result[0]+"/"+result[1]);
		}
//		System.out.println(result[0]+"/"+result[1]);
	}
	
//	分数相加 分子a,分母b
	private static long[] addFenShu(Long a1,int a2,Long b1,int b2) {
		long[] arr = new long[2];
//		找到公倍数
		long gbs = minGBS(b1, b2);
//		找到各自的倍数
		long c1 = gbs/b1;
		long c2 = gbs/b2;
//		相加的分子
		long a3 = a1*c1+a2*c2;
//		化简
		long gys = maxGYS(a3, gbs);
		arr[0] = a3/gys;
		arr[1] = gbs/gys;
		return arr;
	}
	
//	找最小公倍数
	private static long minGBS(Long a,int b) {
		long c = 0;
		long max = a>b?a:b;
		long min = a<b?a:b;
		for (int i = 1; i <= min ; i++) {
			if ((max*i)%min != 0) {
				continue;
			}else {
				c = max*i;
				break;
			}
		}
		return c;
	}
	
//	找最大公因数
	private static long maxGYS(long a,Long b) {
		long c = 1;
		long min = a<b?a:b;
		for (long i = min; i > 0 ; i--) {
			if (a%i==0 && b%i==0) {
				c = i;
				break;
			}else {
				continue;
			}
		}
		return c;
	}

//	规律数组
	private static int[] guiLv(int a,int b) {
		// TODO Auto-generated method stub
		int[] array1 = new int[20];
		array1[0] = a;
		array1[1] = b;
		for (int i = 2; i < 20; i++) {
			array1[i] = array1[i-1] + array1[i-2]; 
		}
		return array1;
	}
}

21、阶乘求和

package woniu.java50;
/**
 * 题目:阶乘求和
 * 求1+2!+3!+…+20!的和
 * @author 26307
 *分析:
 *利用阶乘函数得到阶乘结果,在求和
 *注意位数,20!的结果有19位数
 */
public class T_21_jieChengSum {

	public static void main(String[] args) {
		long sum = 0;
		for (int i = 1; i <= 20; i++) {
			sum += JieCheng(i);
			System.out.println("前"+i+"个数的阶乘之后:"+sum);
		}
	}
//	求阶乘
	private static long JieCheng(int a) {
		long result = 1;
		for (int i = 1; i <= a; i++) {
			result = result*i;
		}
		return result;
	}
}

22、递归求阶乘

package woniu.java50;

import java.util.Scanner;

/**
 * 利用递归方法求5!
 * 增加:自己决定求那个数的阶乘,暂定范围0-20
 * @author 26307
 *分析:
 *递归:函数调用自身
 *long只能求到20!,后边可以使用double类型
 */
public class T_22_diGuiJieCheng {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个正整数(0-20):");
		int a = scanner.nextInt();
		while (a<0 || a>30) {
			System.err.println("输入参数不合法,请重新输入(0-20)内的整数:");
			a = scanner.nextInt();
		}
		if (a==0) {
			System.out.println("0!=1");
		}else {
			System.out.println(a+"!="+DGJC(a, 1));
		}
		scanner.close();
	}
//	递归函数
	private static long DGJC(int a,long b) {
		if (a>0) {
			b = b*a;
			 a--;
			 return DGJC(a, b);
		} else {
			return b;
		}
		
	}
}

23、5个人的年龄

package woniu.java50;
/**
 * 题目:
 * 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
 * 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。
 * 问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。
 * 请问第五个人多大?
 * @author 26307
 *分析:
 *5比4大2岁,4比3大2岁,3比2大2岁,2比1大2岁,1号10岁
 *分别输出5个人的年龄
 */
public class T_23_5NingLing {

	public static void main(String[] args) {
		int a = 10;
		for (int i = 1; i < 6; i++) {
			System.out.println("第"+i+"个人的年龄是"+a+"岁。");
			a+=2;
		}
	}
}

24、随机生成一个8位数以内的多位数,输出是几位数,并倒序输出每一位数上的数字

package woniu.java50;

import java.util.Arrays;

/**
 * 题目:随机生成一个8位数以内的多位数,输出是几位数,并倒序输出每一位数上的数字
 * @author 26307
 *
 */
public class T_24_randomDuoWeiShu {

	public static void main(String[] args) {
		int a = randomNuber(1, 99999999);
		System.out.println("随机生成的多位数是:"+a+",它的位数是"+JiWeiShu(a));
		int[] arr = new int[JiWeiShu(a)];
		arr = ShuChu(JiWeiShu(a), a);
		System.out.println("倒序输出每一位数上的数字:"+Arrays.toString(arr));
	}
	
//	随机生成多位数
	private static int randomNuber (int a,int b) {
//		向上取整:范围会变小,即[a,b]-->[a+1,b]
//		向下取整
		int num = (int)Math.floor(Math.random()*(b-a+1)+a); 
		return num;
	}
	
//	判断是多少位数
	private static int JiWeiShu(int a) {
		int b = 0;
		if (a>9999999) {
			b=8;
		}else if (a>999999) {
			b=7;
		}else if (a>99999) {
			b=6;
		}else if (a>9999) {
			b=5;
		}else if (a>999) {
			b=4;
		}else if (a>99) {
			b=3;
		}else if (a>9) {
			b=2;
		}else {
			b = 1;
		}
		return b;
	}
//	倒序输出每个位上的数值
	private static int[] ShuChu(int a,int b) {
		int[] arr=new int[a];
		switch (a) {
		case 8:
			arr[7] = b/10000000;
		case 7:
			arr[6] = b/1000000%10;
		case 6:
			arr[5] = b/100000%10;
		case 5:
			arr[4] = b/10000%10;
		case 4:
			arr[3] = b/1000%10;
		case 3:
			arr[2] = b/100%10;
		case 2:
			arr[1] = b/10%10;
		case 1:
			arr[0] = b%10;
		default:
			break;
		}
		return arr;
	}
}

25、随机生成一个多位数(1~5位数),判断是否是回文数

package woniu.java50;
/**题目:
 * 随机生成一个5位数以内的多位数,判断它是否是回文数。
 * @author 26307
 *分析:
 *1、回文数必须两边从中间隔开,两边一致,即11,121等
 *2、需要根据位数判断回文数
 */
public class T_25_huiWenShu {

	public static void main(String[] args) {
		int a = randomNuber(1,99999);
		if (0<=a && a<=9) {
			System.out.println(a+"是回文数!");
		}else {
			int b = JiWeiShu(a);
			int[] arr = new int[b];
			arr = ShuChu(b, a);
			PanDuanHuiWenShu(b,arr ,a);
		}
	}
//	随机生成多位数
	private static int randomNuber (int a,int b) {
//		向上取整:范围会变小,即[a,b]-->[a+1,b]
//		向下取整
		int num = (int)Math.floor(Math.random()*(b-a+1)+a); 
		return num;
	}
	
//	判断是多少位数
	private static int JiWeiShu(int a) {
		int b = 0;
		if (a>9999) {
			b=5;
		}else if (a>999) {
			b=4;
		}else if (a>99) {
			b=3;
		}else {
			b=2;
		}
		return b;
	}
//	倒序输出每个位上的数值,参数a位数,b数值
	private static int[] ShuChu(int a,int b) {
		int[] arr=new int[a];
		switch (a) {
		case 5:
			arr[4] = b/10000%10;
		case 4:
			arr[3] = b/1000%10;
		case 3:
			arr[2] = b/100%10;
		case 2:
			arr[1] = b/10%10;
		case 1:
			arr[0] = b%10;
		default:
			break;
		}
		return arr;
	}
//	判断回文数,参数:位数a,每个位上的数字数组arr,原数字b。
	private static void PanDuanHuiWenShu(int a,int[] arr,int b) {
		switch (a) {
		case 2:
			if (arr[0]==arr[1]) {
				System.out.println(b+"是回文数!");
			}else {
				System.out.println(b+"不是回文数!");
			}
			break;
		case 3:
			if (arr[0]==arr[2]) {
				System.out.println(b+"是回文数!");
			}else {
				System.out.println(b+"不是回文数!");
			}
			break;
		case 4:
			if (arr[0]==arr[3] && arr[1]==arr[2]) {
				System.out.println(b+"是回文数!");
			}else {
				System.out.println(b+"不是回文数!");
			}
			break;
		case 5:
			if (arr[0]==arr[4] && arr[1]==arr[3]) {
				System.out.println(b+"是回文数!");
			}else {
				System.out.println(b+"不是回文数!");
			}
			break;
		default:
			break;
		}
	}
}

26、根据首字母或者前两个字母判断是周几

package woniu.java50;

import java.util.Scanner;

/**
 * 题目:
 * 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
 * @author 26307
 *分析:
 *周一到周日的英文分别是:Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
 *注意:	string类型比较是否相等时不能使用“==”,只能使用equals()进行内容比较,string只是表示地址
 */
public class T_26_zhouJi {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入查询周几的首字母:");
		String a = scanner.next();
		while (!(a.equals("m")||a.equals("M"))&&!(a.equals("t")||a.equals("T"))&&!(a.equals("w")||a.equals("W"))&&
				!(a.equals("f")||a.equals("F"))&&!(a.equals("s")||a.equals("S"))) {
			System.err.println("输入超出范围,请重新输入:(m,t,w,f,s)");
			a= scanner.next();
		}
		if (a.equals("t")||a.equals("T")) {
			System.out.println("请输入第二个字母辅助判断:");
			String b = scanner.next();
			while (!(b.equals("u")||b.equals("U"))&&!(b.equals("h")||b.equals("H"))) {
				System.err.println("输入超出范围,请重新输入:(h,u)");
				b = scanner.next();
			}
			if (b.equals("u")||b.equals("U")) {
				System.out.println(a+b+"表示周2");
			}else {
				System.out.println(a+b+"表示周4");
			}
		}else if (a.equals("s")||a.equals("S")) {
			System.out.println("请输入第二个字母辅助判断:");
			String b = scanner.next();
			while (!(b.equals("u")||b.equals("U"))&&!(b.equals("a")||b.equals("A"))) {
				System.err.println("输入超出范围,请重新输入:(a,u)");
				b = scanner.next();
			}
			if (b.equals("u")||b.equals("U")) {
				System.out.println(a+b+"表示周日");
			}else {
				System.out.println(a+b+"表示周6");
			}
		}else if (a.equals("m")||a.equals("M")) {
			System.out.println(a+"表示周1");
		}else if (a.equals("w")||a.equals("W")) {
			System.out.println(a+"表示周3");
		}else 
			System.out.println(a+"表示周5");
		scanner.close();
	}
}


27、100以内的素数

package woniu.java50;
/**
 * 题目:
 * 求100以内的素数
 * @author 26307
 *分析:
 *素数:范围>1的正整数,除了1和它本身之外没有另外的因数
 *判断依据:只需被 2 ~  根号m之间的每一个整数去除就可以了。如果 m 不能被 2 ~ 根号m 间任一整数整除,m 必定是素数。
 *原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于根号m ,另一个大于或等于 根号m。
 *例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=√16,因此只需判定在 2~4 之间有无因子即可。
 *使用这种方法不能说明2,3也是素数,因此需要进一步优化
 */
public class T_27_suShu {
	public static void main(String[] args) {
		for (int i = 2; i <= 100; i++) {
			if (PanDuanSuShu(i)) {
				System.out.println(i+"是素数");
			}
		}
	}
	
//	判断素数
	private static boolean PanDuanSuShu(int a) {
		boolean t = false;
//		强制转化,将double转化为int,省略小数部分
		int b =(int) Math.sqrt(a);
		for (int i = 1; i <= b; i++) {
			if (a%i!=0||i==1) {
				t = true;
				continue;
			}else {
				t = false;
				break;
			}
		}
		return t;
	}
}

28、10个整数进行排序

package woniu.java50;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 题目:
 * 输入10个整数进行排序
 * @author 26307
 *分析:
 *采用数组进行降序和升序排列
 */
public class T_28_paiXu {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入10个整数进行排序:");
		int[] a = new int[10];
		for (int i = 0; i < a.length; i++) {
			System.out.print("请输入第"+(i+1)+"个整数:");
			a[i]=scanner.nextInt(); 
		}
		System.out.println("升序:"+Arrays.toString(shengXu(a)));
		System.out.println("降序: "+Arrays.toString(jiangXu(a)));
		scanner.close();
	}
	
//	升序
	private static int[] shengXu(int[] arr) {
//		轮数
		for (int i = 0; i < arr.length-1; i++) {
//			排序
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j]>arr[j+1]) {
					int max = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = max;
				}
			}
		}
		return arr;
	}
	
//	降序
	private static int[] jiangXu(int[] arr) {
//		轮数
		for (int i = 0; i < arr.length-1; i++) {
//			排序
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j]<arr[j+1]) {
					int min = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = min;
				}
			}
		}
		return arr;
	}
}

29、求矩阵对角线之和

package woniu.java50;

import java.util.Scanner;
import java.util.concurrent.TimeUnit;

/**
 * 题目:
 * 求一个3*3矩阵对角线元素之和
 * @author 26307
 *分析:
 *采用二维素组存储矩阵
 *对角线有2条:即11、22、33和31、22、13
 *注意:统一循环中不允许出现两次同类型的键盘输入获取指令,即nextint等
 *即后边键盘输入的内容尽量放在主函数之中
 */
public class T_29_juZhenDuiJiaoSum {

	public static void main(String[] args) throws InterruptedException {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入矩阵的规格(m*m),范围[2,5]:");
		int m = scanner.nextInt();
		while (m<2||m>6) {
			System.err.println("输入的规格超出范围[2,5],请重新输入:");
			m = scanner.nextInt();
		}
		int[][] arr = new int[m][m];
		arr = GetJuZhen(m);
		TimeUnit.SECONDS.sleep(1);
		System.out.println("-------------操作选项------------");
		System.out.println("    选择1:求左下对角线的之和;");
		System.out.println("    选择2:求左上对角线的之和;");
		System.out.println("    选择3:求两条对角线的之和;");
		System.out.println("请输入选项(1-3):");
		String k = scanner.next();
		while (!k.equals("1") && !k.equals("3") && !k.equals("3") ) {
			System.err.println("输入选项不正确,请重新输入(1-3):");
			k = scanner.next();
		}
		int sum = DuiJiaoXianSum(arr, k);
		System.out.println("您输入的选项是:"+k+",它的和是:"+sum);
		scanner.close();
	}
	
//	画矩阵
	private static int[][] GetJuZhen(int a) {
		// TODO Auto-generated method stub
		Scanner ascanner = new Scanner(System.in);
		int[][] arr = new int[a][a];
		System.out.println("输入"+a+"*"+a+"矩阵的每一个元素,回车结束:");
		for (int i = 0; i < a; i++) {
			for (int j = 0; j < a; j++) {
				System.out.print("请输入位置为"+(i+1)+(j+1)+"的元素:");
				arr[i][j]= ascanner.nextInt(); 
			}
		}
		System.out.println("--------输出输入的"+a+"*"+a+"矩阵---------");
		System.out.println("矩阵arr = ");
		for (int i = 0; i < arr.length; i++) {
			System.out.print("          | ");
			for (int j = 0; j < arr.length; j++) {
				System.out.print("  "+arr[i][j]+"  ");
			}
			System.out.println(" |");
		}
		System.out.println("------------------------------------------");
//		这里不能提前关闭控制,后面还需从键盘获取内容
//		ascanner.close();
		return arr;
	}
	
//	对角线元素相加
	private static int DuiJiaoXianSum(int[][] a,String k) {
		// TODO Auto-generated method stub
		int sum = 0;
		if (k.equals("1")) {
			for (int i = 0; i < a.length; i++) {
				sum += a[i][i];
			}
		}else if (k.equals("2")) {
			for (int i = 0; i < a.length; i++) {
				sum += a[i][a.length-1-i];
			}
		}else {
			for (int i = 0; i < a.length; i++) {
				sum += a[i][i]+a[i][a.length-1-i];
			}
		}
		return sum;
	}
}

30、插入一个数后按照原数组的顺序进行排序

package woniu.java50;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 题目:
 * 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
 * @author 26307
 *分析:
 *建立2个数组,一个是排序好的数组,一个是空白数组
 *优化:
 *自动生成一个指定范围内的随机数组,然后根据指令进行排序
 *扫描排序后的数组得到顺序,然后根据顺序将插入的数放在合适的位置
 */
public class T_30_chaRuArray {
	public static void main(String[] args) {
		Scanner aScanner = new Scanner(System.in);
		System.out.println("-----------------------------创建原数组--------------------------------");
		System.out.println("请输入数组长度(>0,整数):");
		int l = aScanner.nextInt();
		while (l<1) {
			System.err.println("输入错误,请输入一个正整数:");
			l = aScanner.nextInt();
		}
		System.out.println("请输入数组指定范围,闭区间,前者必须大于后者:");
		int a = aScanner.nextInt();
		int b = aScanner.nextInt();
		while (a>b) {
			System.err.println("您输入的第一个数为"+a+",后面的数必必须大于"+a+",请重新输入第二个数:");
			b = aScanner.nextInt();
		}
		int[] arr1 = new int[l];
		for (int i = 0; i < l; i++) {
//			自己写的快捷功能
			arr1[i] = MyShortcuts.Random.randomNumber(a, b);
//			原码如下:
/**
 * //	随机一个数在指定范围内[a,b],a<b
//	调用eg : Random.randomNuber(11, 30)
	public static int randomNumber (int a,int b) {
//		向上取整:范围会变小,即[a,b]-->[a+1,b]
//		向下取整
		int num = (int)Math.floor(Math.random()*(b-a+1)+a); 
		return num;
	}
 */
		}
		System.out.println("原数组为:"+Arrays.toString(arr1));
		System.out.println("---------------------------排序----------------------------------");
		System.out.println("请输入排序选项:1升序,2降序");
		int key = aScanner.nextInt();
		while (key!=1&&key!=2) {
			System.err.println("输入选项错误,请重新输入(1/2):");
			key = aScanner.nextInt();
		}
		int[] arr2 = new int[l];
		if (key==1) {
//			自己写的快捷功能
			arr2 = MyShortcuts.arrayPaiXu.shengXu(arr1);
			System.out.println("升序输出:"+Arrays.toString(arr2));
/**源代码如下:
 * //	升序
	public static int[] shengXu(int[] arr) {
//		轮数
		for (int i = 0; i < arr.length-1; i++) {
//			排序
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j]>arr[j+1]) {
					int max = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = max;
				}
			}
		}
		return arr;
	}
 */
		}else {
//			自己写的快捷功能			
			arr2 = MyShortcuts.arrayPaiXu.jiangXu(arr1);
/**源代码如下:
 * //	降序
	public static int[] jiangXu(int[] arr) {
//		轮数
		for (int i = 0; i < arr.length-1; i++) {
//			排序
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j]<arr[j+1]) {
					int min = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = min;
				}
			}
		}
		return arr;
	}
 */
			System.out.println("降序输出:"+Arrays.toString(arr2));
		}
		System.out.println("------------------------------插入数字并排序-------------------------------");
		int[] arr3 = new int[l+1];
		System.out.println("请输入你要插入的数字(整数):");
		arr3[0] = aScanner.nextInt();
		for (int i = 1; i < arr3.length; i++) {
			arr3[i]= arr2[i-1]; 
		}
		int jg = JianCha(arr2);
		if (jg==1) {
			System.out.println("原数组是升序排序的,插入的数字是"+arr3[0]);
			System.out.println("升序输出插入后的新数组:"+Arrays.toString(MyShortcuts.arrayPaiXu.shengXu(arr3)));
		}else if (jg==2) {
			System.out.println("原数组是降序排序的,插入的数字是"+arr3[0]);
			System.out.println("降序输出插入后的新数组:"+Arrays.toString(MyShortcuts.arrayPaiXu.jiangXu(arr3)));
		}else {
			System.out.println("原数组内所有的元素都相同,插入的数字是"+arr3[0]);
			System.out.println("采用升序输出插入后的新数组:"+Arrays.toString(MyShortcuts.arrayPaiXu.shengXu(arr3)));
		}
		aScanner.close();
	}
//	检查数组顺序,降序2,升序1,数组中所有元素相等0
	private static int JianCha(int[] arr) {
		// TODO Auto-generated method stub
		int jg = 0;
		if (arr[0] > arr[arr.length-1]) {
			jg = 2;
		}else if (arr[0] == arr[arr.length-1]) {
			jg = 0;
		}else {
			jg = 1;
		}
		return jg;
	}
}

31、数组排序

package woniu.java50;
import java.util.Arrays;
/**
 * 题目:数组排序
 * 优化:
 * 自动生成一个数组,由用户决定长度、元素取值范围,并且决定排序顺序
 */
import java.util.Scanner;

public class T_31_arrayPaiXu {
	public static void main(String[] args) {
		System.out.println("------------生成随机数组------------");
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入数组长度(>1的整数):");
		int l = scanner.nextInt();
		while (l<2) {
			System.err.println("输入长度小于1,请重新输入(>1的整数):");
			l = scanner.nextInt();
		}
		int[] arr1 = new int[l];
		System.out.println("请输入数组元素取值范围(整数,空格相隔开,回车结束):");
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		while (a>b) {
			System.err.println("您输入的第一个数"+a+"大于第二个数"+b+",请重新输入第二个数:");
			b = scanner.nextInt();
		}
		for (int i = 0; i < arr1.length; i++) {
			arr1[i]= MyShortcuts.Random.randomNumber(a, b); 
		}
		if (a==b) {
			System.out.println("您输入的数组的所有元素都相等,无需排序,其为"+Arrays.toString(arr1));
			System.exit(0);
		}
		System.out.println("原数组为:"+Arrays.toString(arr1));
		System.out.println("--------------------数组排序-------------------------");
		System.out.println("排序选项:1、升序;2、降序");
		System.out.println("请输入您的选择:");
		int k = scanner.nextInt();
		while (k!=1&&k!=2) {
			System.err.println("输入选项错误,请重新输入(1/2):");
			k = scanner.nextInt();
		}
		if (k==1) {
			System.out.println("您选择的是升序,其结果为:"+Arrays.toString(ShengXu(arr1)));
		}else {
			System.out.println("您选择的是降序,其结果为:"+Arrays.toString(JiangXu(arr1)));
		}
		scanner.close();
	}
	
//	升序排序
	private static int[] ShengXu(int[] arr) {
		// TODO Auto-generated method stub
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j]>arr[j+1]) {
					int a = arr[j];
					arr[j]= arr[j+1];
					arr[j+1] = a;
				}
			}
		}
		return arr;
	}
	
//	降序排序
	private static int[] JiangXu(int[] arr) {
		// TODO Auto-generated method stub
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j]<arr[j+1]) {
					int a = arr[j];
					arr[j]= arr[j+1];
					arr[j+1] = a;
				}
			}
		}
		return arr;
	}
}

32、取一个多位数(7位到9位)其中的任意位上的数值

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月7日
 * 题目:取一个整数a从右端开始的4~7位。
 * 分析:
 * 1、整数至少要达到7位数
 * 2、从右端开始4~7位即千、万、十万、百万
 * 优化:
 * 1、随机生成一个1000000~999999999即7位数到9位数
 * 2、用户决定所取位数的区间并
 */
public class T_32_quWeiShu {
	public static void main(String[] args) {
//		产生随机数值并判断它是几位数
		int num = MyShortcuts.Random.randomNumber(1000000, 999999999);
		int l = MyShortcuts.math.JiWeiShu(num);
		System.out.println("产生的随机数是:"+num+",它是"+l+"位数。");
//		确定取值区间
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入需要取值的位数区间(1-"+l+",前者小于后者):");
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		
		while (a<1||a>l) {
			System.err.println("输入的第一个数值是"+a+",超出范围1-"+l+",请重新输入:");
			a = scanner.nextInt();
		}
		while (b<1||b>l) {
			System.err.println("输入的第二个数值是"+b+",超出范围1-"+l+",请重新输入:");
			b = scanner.nextInt();
		}
		while (a>b) {
			System.err.println("输入的第一个数大于第二个数,系统自动将大小互换。");
			int c=a;
			a=b;
			b=c;
		}
//		获取每个位数上的数值
		int[] arr1 = new int[l];
		arr1 = MyShortcuts.math.ShuChuWeiShu(l, num);
		System.out.print("选中区间["+a+","+b+"]的数值是:");
		for (int i = b-1; i >= a-1; i--) {
			System.out.print(arr1[i]);
		}
		switch (a) {
		case 1:
			System.out.println("(个)");
			break;
		case 2:
			System.out.println("(十)");
			break;
		case 3:
			System.out.println("(百)");
			break;
		case 4:
			System.out.println("(千)");
			break;
		case 5:
			System.out.println("(万)");
			break;
		case 6:
			System.out.println("(十万)");
			break;
		case 7:
			System.out.println("(百万)");
			break;
		case 8:
			System.out.println("(千万)");
			break;
		case 9:
			System.out.println("(亿)");
			break;
		default:
			break;
		}
		scanner.close();
	}
	
}

33、杨辉三角形

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月8日
 * 题目:杨辉三角形
 * 分析:
 * 1、每一行上的数字和行数一致
 * 2、前两行都为1
 * 3、除前两行意外,每行首尾数字都为1,中间数字为上行两个邻近数之和
 * 优化:
 * 1、自设定杨辉三角形的层数和形状(直角或者等腰)
 */
public class T_33_yangHuiSanJiaoXing {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入杨辉三角形的最大层数([1,24]的整数): ");
		int n = scanner.nextInt();
		while (n<1||n>24) {
			System.err.println("您输入的是:"+n+"不在[1,24]内,请重新输入杨辉三角形的最大层数([1,24]的整数):");
			n = scanner.nextInt();
		}
		System.out.println("请选择杨辉三角形的形状:   1、直角三角形;2、等腰三角形;3、两种都输出");
		int k = scanner.nextInt();
		while (k<1||k>3) {
			System.err.println("你输入的选项是:"+k+",没有这个选项,请重新输入(1-3):");
			k = scanner.nextInt();
		}
		DaYingYangHuiSJX(n, k);
		scanner.close();
	}
//	生成杨辉三角形,层数n在[1,24]内,直角三角形
	private static void YangHuiRt(int n) {
		for (int i = 0; i < n; i++) {
			int num = 1;
			for (int j = 0; j < i+1; j++) {
				System.out.format("%9d", num);
				num = num * (i -j)/(j+1);
			}
			System.out.println();
		}
	}
	
//	生成杨辉三角形,层数n在[1,24]内,等腰三角形
	private static void YangHuiDy(int n) {
		for (int i = 0; i < n; i++) {
			int num = 1;
//			打印空白
			System.out.format("%"+((n-i)*5)+"s"," ");
			for (int j = 0; j < i+1; j++) {
				System.out.format("%10d", num);
				num = num * (i -j)/(j+1);
			}
			System.out.println();
		}
	}
//	打印杨辉三角形,层数n,选项k:1、直角三角形;2、等腰三角形;3、两种都输出
	private static void DaYingYangHuiSJX(int n,int k) {
		// TODO Auto-generated method stub
		System.out.println("---------------------打印杨辉三角形---------------------------");
		switch (k) {
		case 1:
			System.out.println("您打印的是直角三角形的杨辉三角形:");
			YangHuiRt(n);
			break;
		case 2:
			System.out.println("您打印的是等腰三角形的杨辉三角形:");
			YangHuiDy(n);
			break;
		case 3:
			System.out.println("这是直角三角形的杨辉三角形:");
			YangHuiRt(n);
			System.out.println("----------------------------------------------------------");
			System.out.println("这是等腰三角形的杨辉三角形:");
			YangHuiDy(n);
			break;

		default:
			break;
		}
	}
}

34、输入一串数字比较大小

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月8日
 * 题目:输入3个整数a,b,c,按大小顺序输出。
 * 分析:将输入的数存储到数组中,进行数组排序
 * 优化:采用数组录入整数,然后利用数组进行排序
 * 用到的快捷功能请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 */
public class T_34_abcBiDaXiao {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入比较大小的整数个数(>=2的整数):");
		int n = scanner.nextInt();
		while (n<2) {
			System.err.println("您输入的数是"+n+",无法进行大小比较,请重新输入(>=2的整数):");
			n = scanner.nextInt();
		}
		int[] arr = new int[n];
		System.out.println("请输入需要比较大小的整数:");
		for (int i = 0; i < n; i++) {
			System.out.println("请输入第"+(i+1)+"个整数:");
			arr[i]=scanner.nextInt();
		}
		System.out.println("请选择排序方式: 1、升序;2、降序;3、两种方式");
		int key = scanner.nextInt();
		while (key<1||key>3) {
			System.err.println("您输入的是"+key+",不在规定范围[1,3]内,请重新输入:");
			key = scanner.nextInt();
		}
		MyShortcuts.array.PaiXuWay(arr, key,true);
		scanner.close();
	}
}

35、找到一个数组的最大值和最小值并分别交换到首尾位置

package woniu.java50;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月8日
 * 用到的快捷功能请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目:
 * 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
 * 分析:
 * 1、找到一个数组中的最大和最小值,然后分别放置在数组的首尾
 * 优化:
 * 1、自定义数组长度
 * 2、随机生成指定范围内的数组元素
 */
public class T_35_JianDanArray {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入数组的长度(>=2的整数):");
		int n = scanner.nextInt();
		while (n<2) {
			System.err.println("您输入的数组长度为:"+n+",不符合要求,请重新输入(>=2的整数):");
			n = scanner.nextInt();
		}
		System.out.println("请输入数组元素的取值范围(2个整数,以空格隔开,回车结束):");
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		if (a>b) {
			int c = a;
			a=b;
			b=c;
		}
		int[] arr = new int[n];
		arr = MyShortcuts.Random.ArrayInt(n, a, b);
		if (a==b) {
			System.out.println("其最大最小值皆为"+a+",已经符合要求无需改变。");
			System.out.println("该数组为:"+Arrays.toString(arr));
		}else {
			System.out.println("输出生成的随机数组:"+Arrays.toString(arr));
			System.out.println("输出交换好的随机数组:"+Arrays.toString(PaiXu(arr)));
		}
		scanner.close();
	}

//	将指定数组的最大值交换到首位,最小值交换到末位
	private static int[] PaiXu(int[] a) {
		int max=a[0],min=a[0];
		int maxi=0,mini=0;
		for (int i = 1; i < a.length; i++) {
			if (a[i]>max ) {
				max = a[i];
				maxi=i;
			}
			if (a[i]<min) {
				min = a[i];
				mini=i;
			}
		}
		a[maxi]=a[0];
		a[0]=max;
		a[mini]=a[a.length-1];
		a[a.length-1] = min;
		return a;
	}
}

36、有n个整数,将最后m个数移到最前面,其余数依次后移m个位置

package woniu.java50;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月8日
 * 用到的快捷功能请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目:
 * 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
 * 分析:
 * 1、将n个数存储到数组之中
 * 2、自定义数组长度n以及向后移动的位置m
 * 3、题目应该理解为:将后面m个数迁移成为前m个数,原先前面的数顺序后移m个位置
 * 优化:
 * 1、可以选择自己输入数据元素或自动生成指定范围内的数组元素
 */
public class T_36_arrayJiaoHuan {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入数组长度(>=2的整数):");
		int n = scanner.nextInt();
		while (n<2) {
			System.err.println("您输入的数组长度为"+n+",不符合要求,请重新输入(>=2的整数):");
			n = scanner.nextInt();
		}
		System.out.println("请做出选择:1、自动生成数组元素;2、输入数组元素。");
		int key = scanner.nextInt();
		while (key<1||key>2) {
			System.err.println("您输入的选项是"+key+",不在规定选项内(1/2),请重新输入:");
			key = scanner.nextInt();
		}
		int[] arr = new int[n];
		if (key==1) {
			System.out.println("您选择自动生成数组元素,请输入数组元素的取值范围(整数):");
			int a = scanner.nextInt();
			int b = scanner.nextInt();
			arr = MyShortcuts.Random.ArrayInt(n, a, b);
		}else {
			System.out.println("你选择的是手动输入元素:");
			for (int i = 0; i < arr.length; i++) {
				System.out.print("请输入第"+(i+1)+"个元素:");
				arr[i]=scanner.nextInt();
				System.out.println();
			}
		}
		System.out.println("生成的初始数组是:"+Arrays.toString(arr));
		System.out.println("请输入后面需要移动的元素个数(范围:[0,"+n+"]):");
		int m = scanner.nextInt();
		while (m<0||m>n) {
			System.err.println("您输入的是"+m+",已经超出规定范围[0,"+n+"],请重新输入:");
			m = scanner.nextInt();
		}
		System.out.println("移动之后的数组为:"+Arrays.toString(YiDong(arr, m)));
		scanner.close();
	}
	
//	元素移动函数,数组a,后面需要移动的元素个数m,返回移动后的数组b
	private static int[] YiDong(int[] a,int m) {
		int[] b = new int[a.length];
		for (int i = 0; i < b.length; i++) {
			if (i<m) {
				b[i] = a[a.length-m+i];
			}else {
				b[i]=  a[i-2];
			}
		}
		return b;
	}
}

37、报数游戏

package woniu.java50;

import java.util.Scanner;
import java.util.concurrent.TimeUnit;

/**
 * 
 * @author 锋
 * @data 2021年9月8日
 * 用到的快捷功能请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目:
 * 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,
 * 问最后留下的是原来第几号的那位。
 * 分析:
 * 1、自定义人数n以及报的最后一个数m
 * 2、报道m的人退出圈子,直到剩下一个人并输出这个人是原来的第几号
 * 3、退圈条件:号数%m==0,结束条件人数为1
 * 4、使用Boolean数组
 */
public class T_37_paoShu {

	public static void main(String[] args) throws InterruptedException {
		Scanner scanner = new Scanner(System.in);
//		获取参加游戏的人数
		System.out.println("请输入参与这个游戏的人数(>1的整数):");
		int n = scanner.nextInt();
		while (n<=1) {
			System.err.println("你输入的人数是"+n+",不符合游戏设定范围(>1的整数),请重新输入:");
			n = scanner.nextInt();
		}
//		生成参与人员数组
		boolean[] aboolean = new boolean[n];
		for (int i = 0; i < aboolean.length; i++) {
			aboolean[i]=true;
		}
//		获取报数指令
		System.out.println("请输入报到哪一个数(从1开始报数,范围[2,10]):");
		int m = scanner.nextInt();
		while (m<2||m>10) {
			System.err.println("您输入的是"+m+",超出设定范围[2,10],请重新输入:");
			m = scanner.nextInt();
		}
		scanner.close();
		System.out.println("------------报数游戏开始咯--------------");
		int jg = PaoShuYpuXi(aboolean, m);
		TimeUnit.SECONDS.sleep(3);
		System.out.println("获胜者是"+jg+"号!");
	}
	
//	报数游戏
	private static int PaoShuYpuXi(boolean[] b,int m) {
		int jg = 0;
		int n = b.length;
		int ps = 1;
//		游戏开始
		while (n!=1) {
			for (int i = 0; i < b.length; i++) {
				if (b[i]) {
					if (ps!=m) {
						ps++;
					}else {
						ps = 1;
						b[i]= false;
						n--;
					}
				}
			}
		}
//		游戏结束,找到胜利者
		for (int i = 0; i < b.length; i++) {
			if (b[i]) {
				jg = i+1;
			}
		}
		return jg;
	}
}

38、统计不同类型的字符

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月8日
 * 用到的快捷功能请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目:
 * 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。 
 * 分析+优化:
 * 1、字符类型有:中文、数字、英文、空格、特殊字符
 * 2、中文范围:ch >= '\u4E00' && ch <= '\u9FEF'
 * 3、数字范围:ch<='9' && ch>='0';英文范围:ch>='a' && ch<='z'||ch>='A' && ch<='Z'
 * 4、空格的ASCII码是32
 */
public class T_38_tongJiZiFu {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入字符串(回车结束输入):");
		String string = scanner.nextLine();
		boolean key = false;
		System.out.println("是否需要输出各种字符的数量: 1、需要;0:不需要(默认不需要)");
		int k = scanner.nextInt();
		while (k<0||k>1) {
			System.err.println("您输入的是"+k+",不符合规定,请重新输入(1/0");
			k = scanner.nextInt();
		}
		scanner.close();
		if (k==1) {
			key = true;
		}
//		使用功能函数
		MyShortcuts.math.TongJiZiFu(string, key);
	}
}

39、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月8日
 * 用到的快捷功能请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 
 * 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,
 * 调用函数1/1+1/3+…+1/n
 * 分析+优化:
 * 1、根据输入的n来决定使用哪种函数求分数和,其中所有的分子都是1
 * 2、当n为偶数时:分母为:2 4 6 8 ... n,测试范围[1,48]int类型
 * 3、当n为奇数时:分母为:1 3 5 7 ... n,测试范围[1,23]int类型
 */
public class T_39_JiOrOuFenShuSum {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个整数(范围:奇数[1,23],偶数[2,48]):");
		int n = scanner.nextInt();
		while ((MyShortcuts.math.PanDuanJiShu(n) && n>23||n<1) || (!MyShortcuts.math.PanDuanJiShu(n) && n>48||n<2)) {
			System.err.println("您输入的是"+n+",超出规定范围(奇数[1,23],偶数[2,48])[1,40],请重新输入:");
			n = scanner.nextInt();
		}
		GuLuFenShuAdd(n);
		scanner.close();
	}
	
//	规律加法
	private static int[] GuLuFenShuAdd(int a) {
		int[] arr1 = new int[2];
//		调用判断是否是奇数函数
		if (MyShortcuts.math.PanDuanJiShu(a)) {
//			当n为奇数时
			arr1[0] = 1;
			arr1[1] = 1;
			if (a>1) {
				for (int i = 3; i <= a; i+=2) {
//					调用int型分数加法:前两个值是相加的两个分子,后面依次是相应的分母
					arr1 = MyShortcuts.math.addFenShuInt(arr1[0],1 ,arr1[1], i);
				}
			}	
		}else {
//			当n为偶数时
			arr1[0] = 1;
			arr1[1] = 2;
			if (a>2) {
				for (int i = 4; i <= a; i+=2) {
//					调用int型分数加法:前两个值是相加的两个分子,后面依次是相应的分母
					arr1 = MyShortcuts.math.addFenShuInt(arr1[0],1 ,arr1[1], i);
				}
			}
		}
		System.out.println("当n="+a+"时,其分数和为:"+arr1[0]+"/"+arr1[1]);
		return arr1;
	}
}

40、给输入的字符串排序

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月9日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 字符串排序。
 * 分析+优化:
 * 1、将字符转化为对应的ASCII码,在存入数组中进行排序
 * 2、将顺序拍好的数组转化为字符串,并输出
 */
public class T_40_ziFuPaiXu {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一串字符:");
		String string1 = scanner.nextLine();
//		使用功能函数将字符串转化为int数组
		int[] arr1 = MyShortcuts.zhuangHuan.string2Array(string1);
		System.out.println("请输入排序方式:1、升序;2、降序");
		int zl = scanner.nextInt();
		while (zl<1||zl>2) {
			System.err.println("您输入的是"+zl+",不在指定范围内,请重新输入(1/2):");
			zl = scanner.nextInt();
		}
		scanner.close();
//		使用功能函数进行排序,不输出排序的数组内容
		arr1 = MyShortcuts.array.PaiXuWay(arr1, zl, false);
//		使用功能函数将数组转化为字符串
		String string2 = MyShortcuts.zhuangHuan.int2String(arr1);
		System.out.println("这是原字符串:"+string1);
		if (zl==1) {
			System.out.print("您选择的是升序,");
		}else {
			System.out.print("您选择的是降序,");
		}
		System.out.println("这是排序好了的字符串:"+string2);
	}
}

41、5只猴子分桃子

详细描述:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

package woniu.java50;
/**
 * 
 * @author 锋
 * @data 2021年9月9日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 
 * 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,
 * 这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,
 * 它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
 * 分析+优化:
 * 1、假设第5只猴子分完桃子并拿走n个桃子,则第五只猴子每一份为n个,总数为s = 5n+1
 * 2、则第四只猴子分的每一份为s/4个,总数为m = s/4 * 5 +1,依次类推
 * 3、条件:并且每一只猴子分完后的数量可以被4整除,且桃子数量必须是正整数
 * 4、2层循环:外层循环找到一个第5只猴子拿的桃子的数量最小且符合前面所有要求,内层检验桃子数量是否符合要求
 */
public class T_41_houZiFenTaoZi {

	public static void main(String[] args) {
		int hz = 5;
		int tz = TaoZiZongShu(hz);
		System.out.println("桃子总数最小为"+tz);
		if (FenTaoZi(tz, hz)) {
			System.out.println("答案符合要求!");
		}else {
			System.out.println("答案不符合要求!!!");
		}
	}
//	分桃子函数,用于验证桃子数量是否正确
	private static boolean FenTaoZi(int tz,int hz) {
		boolean jg = false;
		for (int i = hz; i > 0; i--) {
			tz = (tz-1)/5 * 4;
		}
		if ((tz-1)%5 != 0) {
			jg = true;
		}
		return jg;
	}
	
//	逆向分桃子规律函数,n为猴子拿走1份之后剩下的数量,返回值m为该猴子分的桃子的总数量
	private static int NiXiangFanTaoZi(int n) {
		int m = n/4*5+1;
		return m;
	}
	
//	求桃子总数量
	private static int TaoZiZongShu(int hz) {
		int tz = 0;
		for (int i = 1; ; i++) {
			tz = i*5 + 1;
			while (tz%4==0 && hz>1) {
				tz = NiXiangFanTaoZi(tz);
				if (tz%4==0) {
					hz--;
				}else {
					hz = 5;
					break;
				}
			}
			if (hz == 1) {
				break;
			}
		}
		return tz;
	}
}

42、求809*??=800*??+9*??+1中的??

描述:其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

package woniu.java50;
/**
 * 
 * @author 锋
 * @data 2021年9月9日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 809*??=800*??+9*??+1
 * 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
 * 分析+优化:
 * 1、可以根据“8*??的结果为两位数,9*??的结果为3位数”得到??的取值范围为[12,13]
 * 2、题目有2个要求即求??的值以及809*??的值
 */
public class T_42_qiuLiangWeiShu {

	public static void main(String[] args) {
		boolean tj = false;
		int jg = 0;
		for (int i = 12; i < 14; i++) {
			if (809*i == 800 * i + 9*i+1) {
				jg = i;
				tj = true;
			}
		}
		if (tj) {
			System.out.println("所求的??="+jg+",809*??="+(jg*809));
		}else {
			System.out.println("没有符合要求的数!");
		}
	}
}

43、数组求解0~7的奇数个数

package woniu.java50;

/**
 * 
 * @author 锋
 * @data 2021年9月9日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 求0—7所能组成的奇数个数。
 * 分析+优化:
 * 1、取值区间[0,76543210],但是不允许重复数字,也没有限定位数
 * 2、奇数看个位上的数字是否为奇数,就可以判断是否为奇数
 * 3、0-7有4个奇数和四个偶数,使用数学的排列组合公式
 * 4、注意,在排列组合时最高位不能为0,最低位不能为偶数
 * 不足:
 * 必须满足的条件:元素数组中偶数的个数等于奇数个数或者偶数个数比奇数多一个
 * 结果:
 * 0~7:奇数46972个,偶数48929个
 * 1~8: 奇数54800个,偶数54800个
 */
public class T_43_8ZuChengJiShu {

	public static void main(String[] args) {
		int[] a = {1,2,3,4,5,6,7,8};
//		for (int i = 1; i <= a.length; i++) {
//			int jga1 = MyShortcuts.math.PaiLieZuHeJiShuGeShu(a, i,i);
//			int jga2 = MyShortcuts.math.PaiLieZuHeOuShuGeShu(a, i,i);
//			System.out.println("数字"+Arrays.toString(a)+"可以组成的"+i+"位数有"+jga1+"个奇数,"+jga2+"个偶数");
//		调用功能函数
		int jgaj = MyShortcuts.math.PaiLieZuHeJiShuGeShu(a, 1,a.length);
		int jgao = MyShortcuts.math.PaiLieZuHeOuShuGeShu(a, 1,a.length);
		System.out.println("数字"+Arrays.toString(a)+"可以组成的数有"+jgaj+"个奇数,"+jgao+"个偶数");
		int[] b = {1,2,3,4,5,6,7,0};
//		for (int i = 1; i <= a.length; i++) {
//			int jgb1 = MyShortcuts.math.PaiLieZuHeJiShuGeShu(b, i,i);
//			int jgb2 = MyShortcuts.math.PaiLieZuHeOuShuGeShu(b, i,i);
//			System.out.println("数字"+Arrays.toString(b)+"可以组成的"+i+"位数有"+jgb1+"个奇数,"+jgb2+"个偶数");
		int jgbj = MyShortcuts.math.PaiLieZuHeJiShuGeShu(b, 1,b.length);
		int jgbo = MyShortcuts.math.PaiLieZuHeOuShuGeShu(b, 1,b.length);
		System.out.println("数字"+Arrays.toString(b)+"可以组成的数有"+jgbj+"个奇数,"+jgbo+"个偶数");
//		}
	}
}

44、证明:一个偶数等于两个素数之和。

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月15日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 一个偶数总能表示为两个素数之和。
 * 分析+优化:
 * 1、偶数/2,判断其是否为素数,如果是则输出,不是则分别+-1,在进行判断,直到得到相应的结果
 */
public class T_44_OuShuDY2SuShuSum {

	public static void main(String[] args) {
		for (int i = 2; i < 101; i+=2) {
			ZhengMingOuShuHeSuShu(i);
		}
	}
//	证明函数:一个偶数总能表示2个素数之和
	private static void ZhengMingOuShuHeSuShu(int n) {
		int a = n/2;
//		调用功能函数:判断素数
		if (MyShortcuts.math.PanDuanSuShu(a)) {
			System.out.println(n+"是偶数,且"+n+"="+a+"+"+a+",其中"+a+"是素数!");
		}else {
			int b = a;
			for (int i = a; i >= 0; i--,b++) {
				if (MyShortcuts.math.PanDuanSuShu(i) && MyShortcuts.math.PanDuanSuShu(b)) {
					System.out.println(n+"是偶数,且"+n+"="+i+"+"+b+",其中"+i+"、"+b+"都是素数!");
					break;
				}
				if (i==0) {
					System.err.println("该命题是错误的!");
				}
			}
		}
	}
}

45、判断一个素数能被几个9整除

package woniu.java50;
/**
 * 
 * @author 锋
 * @data 2021年9月15日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 判断一个素数能被几个9整除
 * 分析+优化:
 * 1、此题无解,素数只有2个因数1和它本身
 */
public class T_45_suShuZhengChu9N {

	public static void main(String[] args) {
		for (int i = 1; i < 101; i++) {
			if (MyShortcuts.math.PanDuanSuShu(i)) {
				zhengMing(i);
				System.out.println();
			}
		}
	}
//	证明没有素数可以被(n个)9整除
	private static void zhengMing(int n) {
		for (int i = 1; i < 12; i++) {
			int b = i*9;
			if (n%b!=0) {
				System.out.println("素数"+n+"不能被"+i+"个9整除!");
			}else {
				System.out.println("素数"+n+"能被"+i+"个9整除!");
			}
		}
	}
}

46、拼接2个字符串

package woniu.java50;

import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月15日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 两个字符串连接程序
 * 分析+优化:
 * 1、获取2个字符串的长度,然后新创一个字符数组,再将2个字符串放到新字符串数组中
 */
public class T_46_pinJieZiFuChuang {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入第一个字符串:(回车结束)");
		String aString = scanner.next();
		System.out.println("请输入第二个字符串:(回车结束)");
		String bString = scanner.next();
//		调用功能函数:字符拼接
		String cString = MyShortcuts.string.pingJie2String(aString, bString);
		System.out.println("这是拼接好的新字符串:"+cString);
		scanner.close();
	}
	
}

47、随机从[1,50]生成7个数,并且打印对应个数的*号

package woniu.java50;
/**
 * 
 * @author 锋
 * @data 2021年9月16日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*
 * 分析+优化:
 * 随机在1-50内生成7个数,并且答应出对应个数的*
 */
public class T_47_daYingSuiJiXing {
	public static void main(String[] args) {
		for (int i = 0; i < 7; i++) {
//			调用功能函数:在指定范围内取值
			int  n = MyShortcuts.Random.randomNumber(1, 50);
			System.out.print("第"+(i+1)+"个");
			daYingXingXing(n);
		}
	}
//	打印
	private static void daYingXingXing(int n) {
		System.out.println("随机数为:"+n+",开始打印 “*” :");
		for (int i = 0; i < n; i++) {
			System.out.print("*");
		}
		System.out.println();
	}
}

48、4位数的加密问题

package woniu.java50;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 
 * @author 锋
 * @data 2021年9月16日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 
 * 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:
 * 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
 * 分析+优化:
 * 1、数组存储数据信息
 * 2、加密:数据本身是4位数,获取之和存放于数组中,每个位上的数值+5,在除以10取余数作为新数据,在将1和4、2和3进行交换,生成密文,即再次生成一个四位数
 * 3、解密:先将一个密文即四位数,存放于数组中,然后交换1和4、2和3,因为每个数据都是0~9(千位上没有0),则原先0~4的数变成了5~9,而5~9则变成了0~4,根据上述信息这个完成解密
 */
public class T_48_wenJianJiaMiAndJieMi {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入需要加密的数据(4位数):");
		int n = scanner.nextInt();
//		调用功能函数判断数据是几位数
		while (MyShortcuts.math.JiWeiShu(n)!=4) {
			System.err.println("输入数据不是4位数,请重新输入:");
			n = scanner.nextInt();
		}
		int jm = jiaMi(n);
		int jg = jieMi(jm);
		System.out.println("需要加密的数据是:"+n+",加密的结果是:"+jm+",解密的结果是:"+jg);
		scanner.close();
	}
//	加密
	private static int jiaMi(int n) {
		int jg = 0;
//		调用功能函数将数据存如数组(数据存贮方式从低位到高位)
		int[] arr = MyShortcuts.math.ShuChuWeiShu(4, n);
		System.out.println("加密数组是:"+Arrays.toString(arr));
//		赋新值
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (arr[i]+5)%10; 
		}
//		位数交换:即1和4、2和3交换
		int a = arr[0];
		arr[0] = arr[3];
		arr[3] = a;
		int b = arr[1];
		arr[1] = arr[2];
		arr[2] = b;
//		调用功能函数:将数组内的元素组成一个多位数
		jg = MyShortcuts.math.array2Int(arr);
		return jg;
	}
	
//	解密
	private static int jieMi(int n) {
//		调用功能函数将数据存如数组(数据存贮方式从低位到高位)
		int[] arr = MyShortcuts.math.ShuChuWeiShu(4, n);
		System.out.println("解密数组是:"+Arrays.toString(arr));
//		位数还原:即1和4、2和3交换
		int a = arr[0];
		arr[0] = arr[3];
		arr[3] = a;
		int b = arr[1];
		arr[1] = arr[2];
		arr[2] = b;
//		还原数值大小
		for (int i = 0; i < arr.length; i++) {
			if (arr[i]>= 5 ) {
				arr[i] = arr[i]-5;
			}else {
				arr[i] = arr[i]+5;
			}
		}
//		调用功能函数:将数组内的元素组成一个多位数
		int jg = MyShortcuts.math.array2Int(arr);
		return jg;
	}
}

49、统计字符串子串在父串中出现的次数

package woniu.java50;import java.util.Scanner;


/**
 * 
 * @author 锋
 * @data 2021年9月16日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 计算字符串中子串出现的次数
 * 分析+优化:
 * 1、2个字符串,即字串和父串,统计字串在父串中出现的次数
 * 2、先将字符串转化为数组,然后比较子串和父串
 */
public class T_49_jiSuanZiChuang {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入字符串父串:");
		String fString = scanner.next();
		System.out.println("请输入字符串子串:");
		String zString = scanner.next();
		scanner.close();
		int n = tongJi(fString, zString);
		System.out.println("您输入的子串在父串中出现的次数是:"+n+"次!");
	}
//	统计字串在父串中出现的次数
	private static int tongJi(String f,String z) {
		int jg = 0;
//		调用功能函数:将字符串转化位int数组
		int[] farr = MyShortcuts.string.String2Array(f);
		int[] zarr = MyShortcuts.string.String2Array(z);
		int j =0;
		for (int i = 0; i < farr.length; i++) {
			if (j==zarr.length) {
				j=0;
				jg++;
			}
			if (farr[i] == zarr[j]) {
				j++;
			}else {
				j=0;
			}
		}
		return jg;
	}
}

50、有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件”stud”中。

成绩类函数:

package woniu.java50;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 录入成绩类
 * @author 锋
 * @data 2021年9月16日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 * 题目: 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),
 * 计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件”stud”中
 * 分析+优化:
 * 1、输入到文件的内容有:学号、姓名、各科成绩,计算总分、平均分
 * 2、用户控制学生数量、科目数目
 * 3、用户给生成的txt文件命名
 */
public class T_50_chengJiClass {

//	属性
//	考试名称
	String kaoShi = "2021年下半年期中测试";
//	人数
	int n = 5;
//	学科数目:
	int xueKe = 3;
//	成绩类别
	int m = xueKe+2;
//	学号:
	String[] xueHao = new String[n];
//	姓名
	String[] xingMing = new String[n];
//	学科名
	String[] xueKeStrings = new String[xueKe];
//	学科成绩及并计算学生个人总分和平均分
	int[][] chengJi = new int[n][m];
//	学科单科平均分
	int[] pingJunFen = new int[xueKe];
	
//	方法
	
//	学生信息录入:学生人数a,学科数目b
	public void input() throws IOException {
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		boolean tj = true;
		while (tj) {
			try {
				System.out.println("请输入考试科目名称:");
				for (int i = 0; i < xueKe; i++) {
					System.out.println("请输入第"+(i+1)+"个科目的名称:");
					xueKeStrings[i] = bReader.readLine(); 
				}
				for (int i = 0; i < n; i++) {
					System.out.println("请输入第"+(i+1)+"个学生的学号:");
					xueHao[i] = bReader.readLine();
					System.out.println("请输入第"+(i+1)+"个学生的姓名:");
					xingMing[i] = bReader.readLine();
					int sum = 0;
					for (int j = 0; j < xueKe; j++) {
						System.out.println("请输入第"+(i+1)+"个学生的"+xueKeStrings[j]+"成绩:");
//						这种只能读取一个数据就跳出循环
//						chengJi[i][j]= bReader.read(); 
//						Integer.parseInt可以将任何类型转化为int类型
						chengJi[i][j] = Integer.parseInt(bReader.readLine());
						sum += chengJi[i][j];
					}		
					chengJi[i][m-2] = sum;
					chengJi[i][m-1] = (int) sum/xueKe;
				}
				tj = false;
			} catch (Exception e) {
				// TODO: handle exception
				System.out.println("错误!");
			}
		}
//		IOException只能存在一个close
//		bReader.close();
	}
	
	
//	输出学生信息成text文件
	public void output() throws IOException {
		FileWriter fWriter = new FileWriter("D://学习//java//交互文件//java50//"+kaoShi+".txt");
		BufferedWriter bWriter = new BufferedWriter(fWriter);
		bWriter.write("学号	  "+"姓名   ");
		for (int i = 0; i < xueKe; i++) {
			bWriter.write(xueKeStrings[i]+"  ");
		}
		bWriter.write("总分   "+"平均分");
		bWriter.newLine();
		for (int i = 0; i < n; i++) {
			bWriter.write(xueHao[i]+"   "+xingMing[i]);
			for (int j = 0; j < m ; j++) {
				bWriter.write("  "+chengJi[i][j]);
			}
			bWriter.newLine();
		}
		System.out.println("完成!");
//		IOException只能存在一个close并且前者不能显示输出内容
//		fWriter.close();
		bWriter.close();
	}
	
}

调用:

package woniu.java50;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


/**
 * 成绩
 * @author 锋
 * @data 2021年9月22日
 * 用到的功能函数请参考网址:https://blog.csdn.net/qq_43177828/article/details/120166877
 */
public class T_50_chengJiTest {
	public static void main(String[] args) throws IOException {
		T_50_chengJiClass cj = new T_50_chengJiClass();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输如考试名称:");
		cj.kaoShi = br.readLine();
		System.out.println("请输入参考人数:");
		cj.n = Integer.parseInt(br.readLine());
		System.out.println("请输入考试科目数目:");
		cj.xueKe = Integer.parseInt(br.readLine());
		cj.input();
		cj.output();
	}
}

结果截图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值