ProgramImplement.java

package ProgramPractice;

import java.util.*;


public class ProgramImplement {
	
	//problem 1:calculate rabbits
	
	 # 古典问题:有一对兔子,从出生后第3个月起
	 # 每个月都生一对兔子,小兔子长到第三个月后
	 # 每个月又生一对兔子,假如兔子都不死,问每
	 # 个月的兔子对数为多少?
	 
	public void quantityOfRabbit() {
		System.out.println("输入你想知道的具体月份:");
		int month;
		Scanner input = new Scanner(System.in);
		while(!input.hasNextInt()) {
			System.out.println("请输入正整数:");
			input.next();
		}
		month = input.nextInt();
		System.out.println("第" + month + "个月兔子数量为:" + fac(month));
		System.out.println("前" + month + "个月兔子数量为:");
		for(int i = 1; i < month; i++) {
			System.out.print(fac(i) + " ");
		}
		input.close();
	}
	
	//recursion to calculate the quantity of rabbits
	private static int fac(int i) {
		if(i == 1 || i == 2) return 1;
		return fac(i-1) + fac(i-2);
	}
	
	//problem 2:find the prime numbers between 101 to 200
	
	 # 判断101-200之间有多少个素数,并输出所有素数
	 
	public void findPrimeNumber() {
		int sum = 0;
		for(int i = 101; i < 201; i++) {
			if(isPrimeNumber(i)) {
				System.out.print(i + " ");
				sum++;
			}
		}
		System.out.println("总共有" + sum + "个素数");
	}
	
	//calculate a number is a prime number or not
	private static boolean isPrimeNumber(int num) {
		if(num < 2) return false;
		for(int i = 2; i <= Math.sqrt(num); i++) {
			if(num % i == 0) return false;
		}
		return true;
	}
	
	//problem 3:print all daffodil number
	
	 # 打印出所有的”水仙花数”,所谓”水仙花数”
	 # 是指一个三位数,其各位数字立方和等于该数
	 # 本身。例如:153是一个”水仙花数”,因为
	 # 153=1的三次方+5的三次方+3的三次方。
	 
	public void printDaffodilNumber() {
		int unit, ten, hund;
		for(int i = 100	; i < 1000; i++) {
			unit = i % 10;
			ten = i / 10 % 10;
			hund = i/100;
			if(unit*unit*unit + ten*ten*ten + hund*hund*hund == i) {
				System.out.print(i + " ");
			}
		}
	}
	
	//problem 4:decompose a number by multiple its factor
	
	 # 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

	public void decomposeNumber() {
		System.out.println("请输入你想分解的整数: ");
		int number;
		Scanner input = new Scanner(System.in);
		while(!input.hasNextInt()) {
			System.out.println("请输入一个正整数: ");
			input.next();
		}
		number = input.nextInt();
		if(number > 0) {
			System.out.print(number + "=");
			if(number == 1) System.out.print(number);
			for(int i = 2; i <= number; i++) {
				while(number % i == 0 && i != number) {
					number /= i;
					System.out.print(i + "*");
				}
				if(i == number) {
					System.out.println(i);
					break;
				}
			}
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	//problem 5:grading
	
	 # 利用条件运算符的嵌套来完成此题:学习成绩>=90分
	 # 的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
	 
	public void grade() {
		System.out.println("请输入学生的成绩:");
		double grade;
		Scanner input = new Scanner(System.in);
		while(!input.hasNextDouble()) {
			System.out.println("请输入一个数字: ");
			input.next();
		}
		grade = input.nextDouble();
		String level = grade >= 90 ? "A" : (grade >= 60 ? "B" : "C");
		System.out.println("该同学的级别为: " + level + "级");
		input.close();
	}
	
	//problem 6:gcd and lcm
	
	 # 输入两个正整数m和n,求其最大公约数和最小公倍数。
	 
	public void gcdAndLcm() {
		System.out.println("请输入两个正整数:");
		int gcd, lcm;
		Scanner input = new Scanner(System.in);
		while(!input.hasNextInt()) {
			System.out.println("请输入一个正整数: ");
			input.next();
		}
		int num1 = input.nextInt();
		while(!input.hasNextInt()) {
			System.out.println("请输入一个正整数: ");
			input.next();
		}
		int num2 = input.nextInt();
		int temp = num1 * num2;
		
		if(num1 > 0 && num2 > 0) {
			gcd = gcdVal(num1, num2);
			lcm = temp / gcd;
			System.out.println("最大公约数为: " + gcd);
			System.out.println("最小公倍数为: " + lcm);
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	//calculate the value of gcd
	private static int gcdVal(int num1, int num2) {
		int num3 = Math.max(num1,  num2);
		int num4 = Math.min(num1,  num2);
		int remainder = 1;
		while(remainder != 0) {
			remainder = num3 % num4;
			num3 = num4;
			num4 = remainder;
		}
		return num3;
	}
	
	//problem 7: calculate different type of char in a string
	
	 # 输入一行字符,分别统计出其英文字母、空格、数字和其它字符的个数。
	 
	public void quantityOfDifferentType() {
		System.out.println("请输入一个字符串: ");
		Scanner input = new Scanner(System.in);
		String str = input.nextLine();
		int len = str.length();
		int letters = 0, space = 0, numbers= 0, otherType = 0;
		char[] ch = str.toCharArray();
		for(int i = 0; i < len; i++) {
			if((ch[i] >= 'a' && ch[i] <= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z')) {
				letters++;
			} else if(ch[i] == ' ') {
				space++;
			} else if(ch[i] >= '0' && ch[i] <= '9') {
				numbers++;
			} else {
				otherType++;
			}
		}
		System.out.println("字符串中一共有: " + letters + "个字母");
		System.out.println("字符串中一共有: " + space + "个空格");
		System.out.println("字符串中一共有: " + numbers + "个数字");
		System.out.println("字符串中一共有: " + otherType + "个其他字符");
		input.close();
	}
	
	//problem 8:get the sum
	
	 # 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。
	 # 例如2+22+222+2222+22222(此时共有5个数相加),
	 # 几个数相加有键盘控制。输出结果的形式如:2+22+222=246;
	 
	public void getTheSum() {
		System.out.println("请输入个位数: ");
		Scanner input = new Scanner(System.in);
		while(!input.hasNextInt()) {
			System.out.println("请输入一个正整数: ");
			input.next();
		}
		int number = input.nextInt();
		System.out.println("请输入需要相加的数的个数: ");
		while(!input.hasNextInt()) {
			System.out.println("请输入一个正整数: ");
			input.next();
		}
		int size = input.nextInt();
		if(size > 0) {
			int temp = 0, sum = 0;
			for(int i = 0; i < size-1; i++) {
				temp += number;
				sum += temp;
				number *= 10;
				System.out.print(temp + "+");
			}
			temp += number;
			sum += temp;
			System.out.print(temp + "=" + sum);
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	//problem 9:find the perfect number
	
	 # 一个数如果恰好等于它的因子之和,这个数就称为”完数”。
	 # 例如6=1+2+3.编程找出1000以内的所有完数。
	 
	public void findThePerfectNumber() {
		for(int i = 1; i < 1000; i++) {
			int num = 0;
			for(int j = 1; j <= i/2; j++) {
				if(i % j == 0) num += j;
			}
			if(i == num) System.out.print(i + " ");
		}
	}
	
	//problem 10: get the distance which a ball has traveled and the height right now
	
	 # 一球从h米高度自由落下,每次落地后反跳回原高度的一半;再落下,
	 # 求它在 第n次落地时,共经过多少米?第n次反弹多高?
	 
	public void getDistanceAndHeight() {
		System.out.println("请输入下落高度以及落地次数: ");
		Scanner input = new Scanner(System.in);
		while(!input.hasNextFloat()) {
			System.out.println("请输入一个数字: ");
			input.next();
		}
		float height = input.nextFloat();
		while(!input.hasNextInt()) {
			System.out.println("请输入一个整数: ");
			input.next();
		}
		int n = input.nextInt();
		if(n > 0 && height > 0) {
			float distance = height;
			height /= 2;
			for(int i = 2; i <= n; i++) {
				distance += height*2;
				height /= 2;
			}
			System.out.println("第" + n + "次落地时共经过" + distance + "米");
			System.out.println("第" + n + "次反弹高度为" + height + "米");
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	//problem 11: get different and no-repeat number constructed by number 1, 2, 3, 4
	
	 # 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
	 
	public void differentAndNoRepeatNumber() {
		for(int i = 1; i <= 4; i++) {
			for(int j = 1; j <= 4; j++) {
				if(i == j) continue;
				for(int k = 1; k <= 4; k++) {
					if(j == k || i == k) continue;
					System.out.print(i*100 + j*10 + k + " ");
				}
			}
		}
	}
	
	//problem 12: calculate the bonus base on profit

	 # 企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
	 
	public void calculateBonus() {
		double profit, bonus;
		System.out.println("请输入当月利润:");
		Scanner input = new Scanner(System.in);	
		while(!input.hasNextDouble()) {
			System.out.println("请输入一个数字:");
		    input.next();        
		}
		profit = input.nextDouble();
		if(profit < 0) {
			input.close();
			throw new RuntimeException();
		} else if(profit <= 10) {
			bonus = profit*0.1;
		} else if(profit <= 20) {
			bonus = (profit - 10)*0.075 + 1;
		} else if(profit <= 40 ) {
		    bonus = (profit - 20)*0.05 + 20*0.075 + 1;   
		} else if(profit <= 60 ) {
		    bonus = (profit - 40)*0.03 + 40*0.05 + 20*0.075 + 1;   
		} else if(profit <= 100 ) {
		    bonus = (profit - 60)*0.015 + 60*0.03 + 40*0.05 + 20*0.075 + 1;  
		} else {
			bonus = (profit - 100)*0.01 + 100*0.015 + 60*0.03 + 40*0.05 + 20*0.075 + 1;
		}
		System.out.println(profit + "万元利润,可以获得:" + bonus + "万元奖金");
		input.close();
	}
	
	//problem 13: find the perfect square number
	
	 # 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
	 
	public void findPerfectNumber() {
		int num1, num2;
		for(int i = -100; i < 1000001; i++) {
			num1 = (int)Math.sqrt(i + 100);
			num2 = (int)Math.sqrt(i + 268);
			if(num1*num1 == i + 100 && num2*num2 == i + 268)
				System.out.println(i);
		}
	}
	
	//problem 14: calculate a date and output what number it is in a year
	
	 # 输入某年某月某日,判断这一天是这一年的第几天?
	 
	public void calculateADate() {
		System.out.println("请输入年月日:");
		Scanner input = new Scanner(System.in);
		int year = input.nextInt();    
		int month = input.nextInt();
		int day = input.nextInt();
		int sum = day;
		int[] arr = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		if(year >= 0 && (month > 0 && month <13) && (day <= arr[month]) && day > 0) {
			for(int i = 0; i < month-1; i++) {
				sum += arr[i];
			}
			if(!((year % 400 == 0 || ((year % 4 == 0) && (year % 100 != 0))) && (month > 2))) {
				sum -= 1;
			}
			System.out.println("这是这一年的第" + sum + "天");
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	//problem 15: sort three numbers in down order
	
	 # 输入三个整数x,y,z,请把这三个数由小到大输出。
	 
	public void sortThreeNumber() {
		sortThreeNumbers("descend");	
	}
	
	private static void sortThreeNumbers(String str) {
		System.out.println("请输入三个数字:");
		Scanner input = new Scanner(System.in);
		while(!input.hasNextInt()) {
			System.out.println("请输入数字!");
			input.next();
		}
		int x = input.nextInt();
		int y = input.nextInt();
		int z = input.nextInt();
		int max = Math.max(x, y);
		int min = Math.min(x, y);
		int temp = max > z ? z : max;
		temp = min < temp ? temp : min;
		max = max > z ? max : z;
		min = min < z ? min : z;
		if(str == "descend") {
			System.out.println(max + " " + temp + " " + min);
		} else if (str == "ascend") {
			System.out.println(min + " " + temp + " " + max);
		}
		input.close();
	}
	
	//problem 16: multiple table
	
	 # 输出9*9口诀。
	 
	public void multipleTable() {
		for(int i = 1; i <= 9; i++) {
			for(int j = 1; j <= i; j++) {
				System.out.print(j + "*" + i + "=" + i*j + " ");
			}
			System.out.println();
		}
	}
	
	//problem 17: calculate the sum of peaches which monky picked
	
	 # 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,
	 # 还不瘾,又多吃了一个第二天早上又将剩下的桃子 吃掉一半,
	 # 又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
	 # 到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
	 
	public void getTheSumOfPeach() {
		int sum = 1;
		for(int i = 9; i > 0; i--) {
			sum = 2*(sum+1);
		}
		System.out.println("一共摘了" + sum + "个");
	}
	
	//problem 18: print the list of three race
	
	 # 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
	 # 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,
	 # c说他不和x,z比,请编程序找出三队赛手的名单。
	 
	public void getTheListOfRace() {
		String a, b, c;
		String[] arr = {"x", "y", "z"};
		for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 3; j++) {
				if(i == j) continue;
				for(int k = 0; k < 3; k++) {
					if(j == k || i == k) continue;
					a = arr[i];
					b = arr[j];
					c = arr[k];
					if(!a.equals("x") && !c.equals("x") && !c.equals("z")) {
						System.out.println("a的对手是:"+a+"   b的对手是:"+b+"   c的对手是:"+c);
					}
				}
			}
		}
	}
	
	//problem 19: print a diamond
	
	 # 打印出如下图案(菱形)   
     #       *   
     #      ***   
     #     *****   
     #    *******   
     #     *****   
     #      ***   
     #       *   
	 
	public void printADiamond() {
		for(int i = 0; i < 4; i++) {
			for(int j = 0; j < 3-i; j++) {
				System.out.print(" ");
			}
			for(int k = 0; k <= 2*i; k++) {
				System.out.print("*");
			}
			System.out.println();
		}
		for(int i = 3; i > 0; i--) {
			for(int j = 3-i+1; j > 0; j--) {
				System.out.print(" ");
			}
			for(int k = 0; k < 2*i-1; k++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
	
	//problem 20: calculate the sum of 20 fractional numbers
	
	 # 有一分数序列:2/1,3/2,5/3,8/5,13/8,
	 # 21/13...求出这个数列的前20项之和。

	public void getTheSumOfFractionalNumbers() {
		float numerator = 2;
		float denominator = 1;
		float fraction;
		float sum = 0;
		float temp;
		for(int i = 0; i < 20; i++) {
			fraction = numerator/denominator;
			sum += fraction;
			temp = numerator + denominator;
			denominator = numerator;
			numerator = temp;
		}
		System.out.print(sum);
	}
	
	//problem 21: calculate the sum of 20 numbers' factorial
	
	 # 求1+2!+3!+...+20!的和
	 
	public void getTheSumOfFactorial() {
		int sum = 0;
		for(int i = 1; i <= 20; i++) {
			sum += getTheFactorial(i);
		}
		System.out.println(sum);
	}
	
	//get the factorial of a number
	private static int getTheFactorial(int i) {
		int res = 1;
		for(int j = 1; j <= i; j++) {
			res *= j;
		}
		return res;
	}
	
	//problem 22: get the factorial by recursion
	
	 # 利用递归方法求5!。
	 
	public void getTheFactorialByRecursion() {
		System.out.println(recursionFactorial(5));
	}
	
	private static int recursionFactorial(int i) {
		if(i == 1) return 1;
		return i * recursionFactorial(i-1);
	}
	
	//problem 23: get the age of the 5th person
	
	 # 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,
	 # 他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。
	 # 最后问第一个人,他说是10岁。请问第五个人多大?
	 
	//non-recursion
	public void getTheAge() {
		int age = 10;
		for(int i = 2; i <= 5; i++) {
			age += 2;
		}
		System.out.println(age);
	}
	
	//recursion
	public void getTheAgeByRecursion() {
		System.out.println(rec(5, 2));
	}
	
	private static int rec(int number, int age) {
		if(number == 1) return 10;
		return age + rec(number - 1, age);
	}
	
	//problem 24: print a number in inverted sequence
	
	 # 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
	 
	public void backwardPrint() {
		System.out.println("请输入一个不大于5位的正整数:");
		Scanner input = new Scanner(System.in);
		int number;
		while(!input.hasNextInt()) {
			System.out.println("请输入正整数:");
			input.next();
		}
		number = input.nextInt();
		int i = 0;
		int[] arr = new int[5];
		if(number > 0) {
			while(number != 0) {
				arr[i] = number % 10;
				number /= 10;
				i++;
			}
			System.out.println("这是一个" + i + "位数,逆序输出结果为;");
			for(int j = 0; j < i; j++) {
				System.out.print(arr[j] + " ");
			}
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	//problem 25: judge a number if a 5 bit palindrome number or not
	
	 # 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
	 
	public void palindromeNumber() {
		System.out.println("请输入一个5位的正整数:");
		Scanner input = new Scanner(System.in);
		int number;
		while(!input.hasNextInt()) {
			System.out.println("请输入正整数:");
			input.next();
		}
		number = input.nextInt();
		int i = 0;
		int[] arr = new int[5];
		if(number > 0) {
			while(number != 0) {
				arr[i] = number % 10;
				number /= 10;
				i++;
			}
			if(i != 5) {
				input.close();
				throw new RuntimeException();
			}
			if(arr[0] == arr[4] && arr[1] == arr[3]) {
				System.out.println("这是一个回文数!");
			} else {
				System.out.println("这不是一个回文数!");
			}
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	// problem 26: judge the date is what day by input
	
	 # 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
	 
	public void whatDayIsIt() {
		System.out.println("请输入第一个字母:");
		Scanner input = new Scanner(System.in);
		String ch;
		ch = input.next();
		String ch1;
		switch(ch) {
		case "m":
			System.out.println("Monday");
			break;
		case "t":
			System.out.println("请输入第二个字母:");
			ch1 = input.next();
			switch(ch1) {
			case "u":
				System.out.println("Tuesday");
				break;
			case "h":
				System.out.println("Thursday");
				break;
			default:
				System.out.println("输入有误!");
				break;
			}
		case "w":
			System.out.println("Wednesday");
			break;
		case "f":
			System.out.println("Friday");
			break;
		case "s":
			System.out.println("请输入第二个字母:");
			ch1 = input.next();
			switch(ch1) {
			case "a":
				System.out.println("Saturday");
				break;
			case "h":
				System.out.println("Sunday");
				break;
			default:
				System.out.println("输入有误!");
				break;
			}
		default:
			System.out.println("输入有误!");
			break;
		}
		input.close();
	}
	
	//problem 27: print the prime number within 100
	
	 # 求100之内的素数
	 
	public void primeNumberWithinOneHundred() {
		for(int i = 2; i < 100; i++) {
			if(isPrimeNumber(i)) {
				System.out.print(i + " ");
			}
		}
	}
	
	//problem 28: sort 10 numbers
	
	 # 对10个数进行排序
	 
	public void sortNumbers() {
		System.out.println("请输入十个数字:");
		Scanner input = new Scanner(System.in);
		double[] arr = new double[10];
		for(int i = 0; i < 10; i++) {
			arr[i] = input.nextDouble();
		}
		input.close();
		quickSort(arr, 0, 9);
		System.out.println("排列后的数组:"+Arrays.toString(arr));
	}
	
	private static void quickSort(double[] arr, int low, int high) {
        int i, j;
        double temp;
        if(low > high){
            return;
        }
        i = low;
        j = high;
        temp = arr[low];
        while(i < j) {
            while(temp <= arr[j] && i < j) {
                j--;
            }
            while(temp >= arr[i] && i < j) {
                i++;
            }
            if (i < j) {
            	double z = arr[i];
                double y = arr[j];
                arr[i] = y;
                arr[j] = z;
            }
        }
        arr[low] = arr[i];
        arr[i] = temp;
        quickSort(arr, low, j-1);
        quickSort(arr, j+1, high);
    }
	
	//problem 29: calculate the sum of numbers in diagonal of a 3*3 matrix
	
	 # 求一个3*3矩阵对角线元素之和
	 
	public void sumOfNumberInDiagonal() {
		System.out.println("请输入3*3矩阵");
		Scanner input = new Scanner(System.in);
		double[][] matrix = new double[3][3];
		for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 3; j++) {
				matrix[i][j] = input.nextDouble();
			}
		}
		System.out.println("左上角到右下角的对角线的元素之和为:" + (matrix[0][0] + matrix[1][1] + matrix[2][2]));
		System.out.println("左下角到右上角的对角线的元素之和为:" + (matrix[0][2] + matrix[1][1] + matrix[2][0]));
		input.close();
	}
	
	//problem 30: print a number in a sorted array
	
	 # 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
	
	public void insertANumberInSortedArray() {
		System.out.println("请输入数组元素个数:");
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		double[] arr = new double[n];
		double[] arr1 = new double[n+1];
		for(int i = 0; i < n; i++) {
			arr[i] = input.nextDouble();
		}
		quickSort(arr, 0, arr.length-1);
		System.out.println("排列后的数组:"+Arrays.toString(arr));
		System.out.println("请输入需要插入的元素");
		double num = input.nextDouble();
		if(num > arr[n-1]) {
			for(int i = 0; i < n; i++) {
				arr1[i] = arr[i];
			}
			arr1[n] = num;
		} else {
			for(int i = 0; i < n; i++) {
				if(num < arr[i]) {
					for(int j = 0; j < i; j++) {
						arr1[j] = arr[j]; 
					}
					arr1[i] = num;
					for(int j = i; j < n; j++) {
						arr1[j+1] = arr[j];
					}
				break;	
				}
			}
		}
		System.out.println("插入一个数后的数组为:"+Arrays.toString(arr1));
		input.close();
	}
	
	//problem 31: reverse an array
	
	 # 将一个数组逆序输出
	 
	public void reverseAnArrayAndPrint() {
		System.out.println("请输入数组元素个数:");
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		double[] arr = new double[n];
		double[] arr1 = new double[n];
		for(int i = 0; i < n; i++) {
			arr[i] = input.nextDouble();
		}
		for(int i = 0; i < n; i++) {
			arr1[i] = arr[n-1-i];
		}
		System.out.println("逆序输出如下:"+Arrays.toString(arr1));
		input.close();
	}
	
	//problem 32: get the 4th to 7th bit from right to left in a number
	
	 # 取一个整数a从右端开始的4~7位。
	 
	public void getTheDesignateBitInANumber() {
		 System.out.println("输入一个大于7位的整数:");
		 Scanner input = new Scanner(System.in);
		 long number = input.nextLong();
		 int i = 0;
		 long temp = number;
		 while(temp != 0) {
			 temp /= 10;
			 i++;
		 }
		 if(i >= 7) {
			 long[] arr = new long[i];
			 int j = 0;
			 while(number != 0) {
				 arr[j] = number % 10;
				 number /= 10;
				 j++;
			 }
			 System.out.println(arr[6] + "" + arr[5] + "" + arr[4] + "" + arr[3]);
		 } else {
			 System.out.println("输入有误!");
		 }
		 input.close();
	}
	
	public void getTheDesignateBitInANumber1() {
		System.out.println("输入一个整数:");
		Scanner input = new Scanner(System.in);
		long number = input.nextLong();
	    String str = Long.toString(number);
	    char[]ch = str.toCharArray();
	    int n = ch.length;
	    System.out.println(ch[n-7] + ch[n-6] + ch[n-5] + ch[n-4]);
	    input.close();

	}
	
	//problem 33: print the first ten line of pascal triangle
	
	 # 打印出杨辉三角形(要求打印出10行)
	 
	public void printThePascalTriangle() {
		int[][] arr = new int[10][10];
		for(int i = 0; i < 10; i++) {
			arr[i][0] = 1;
		}
		for(int i = 1; i < 10; i++) {
			for(int j = 1; j < 10; j++) {
				arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
			}
		}
		for(int i = 0; i < 10; i++) {
			for(int j = 9-i; j > 0; j--) {
				System.out.print(" ");
			}
			for(int k = 0; k < 10; k++) {
				if(arr[i][k] != 0) {
					System.out.print(arr[i][k] + " ");
				}
			}
			System.out.println();
		}
	}
	
	//problem 34: print three numbers in descending order
	
	 # 输入3个数a,b,c,按大小顺序输出。
	 
	public void printNumbersInDescendingOrder() {
		sortThreeNumbers("ascend");
	}
	
	//problem 35: exchange elements in an array
	
	 # 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
	 
	public void exchangeElementInArrayAndPrint() {
		System.out.println("请输入一组数字(以空格分开)");
		Scanner input = new Scanner(System.in);
		input.useDelimiter("\\s");
		int[] arr = new int[100];
		int len = 0;
		while(input.hasNextInt()) {
			arr[len++] = input.nextInt();
		}
		int[] temp = new int[len];
		for(int i = 0; i < len; i++) {
			temp[i] = arr[i];
		}
		int max = temp[0];
		int min = max;
		for(int i = 1; i < len; i++) {
			if(temp[i] > max) {
				max = temp[i];
			}
			if(temp[i] < min) {
				min = temp[i];
			}
		}
		int maxIndex = 0, minIndex = 0;
		for(int i = 0; i < len; i++) {
			if(temp[i] == max) maxIndex = i;
		}
		int tempElement = temp[0];
		temp[0] = temp[maxIndex];
		temp[maxIndex] = tempElement;
		for(int i = 0; i < len; i++) {
			if(temp[i] == min) minIndex = i;
		}
		tempElement = temp[len-1];
		temp[len-1] = temp[minIndex];
		temp[minIndex] = tempElement;
		System.out.println(Arrays.toString(temp));
        input.close();
	}
	
	//problem 36: right shift m bits for an n elements array
	
	 # 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
	 
	public void rightShift() {
		System.out.println("请输入个数n:");
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		int[] arr = new int[n];
		System.out.println("请输入n个数");
		for(int i = 0; i < n; i++) {
			arr[i] = input.nextInt();
		}
		System.out.println("没移动前的数组:"+Arrays.toString(arr));
		System.out.println("请输入要移动位数m");
		int m = input.nextInt();
		m %= n;
		int[] temp = new int[n];
		int index = 0;
		for(int i = m; i < n; i++) {
			temp[i] = arr[index++];
		}
		for(int i = 0; i < m; i++) {
			temp[i] = arr[index++];
		}
		System.out.println("移动后的数组:"+Arrays.toString(temp));
		input.close();
	}
	
	//problem 37: what number is left after counting off
	
	 # 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
	 # 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
	 
	void lastNumberLeft() {
		System.out.println("请输入人数");
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		if(n > 0) {
			boolean[] arr = new boolean[n];
			for(int i = 0; i < n; i++) {
				arr[i] = true;
			}
			int currentIndex = 0;
			int currentNumber = 0;
			int currentSum = n;
			while(currentSum > 1) {
				if(arr[currentIndex]) {
					currentNumber++;
					if(currentNumber == 3) {
						currentNumber = 0;
						currentSum -= 1;
						arr[currentIndex] = false;
					}
				}
				currentIndex++;
				if(currentIndex == n) {
					currentIndex = 0;
				}
			}
			for(int i = 0; i < n; i++) {
				if(arr[i]) {
					System.out.println(i+1);
				}
				input.close();
			}
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	//problem 38: get the length of a string
	
	 # 写一个函数,求一个字符串的长度
	 
	public void getTheLength() {
		System.out.println("请输入字符串");
		Scanner input = new Scanner(System.in);
		String str = input.next();
		System.out.println("长度为:" + str.length());
		input.close();
	}
	
	//problem 39: get the sum by call pointer function
	
	 # 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,
	 # 当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
	 
	public void getTheSumByCallPointerFunction() {
		System.out.println("请输入一个整数:");
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		if(n > 0) {
			if(n % 2 == 0) {
				getSum(n, 2);
			} else {
				getSum(n, 1);
			}
		}
		input.close();
	}
	
	private static void getSum(int n, int mode) {
		double sum = 0;
		for(double i = mode; i <= n; i += 2) {
			sum += 1/i;
		}
		System.out.println(sum);
	}
	
	//problem 40: sort some strings
	
	 # 字符串排序
	 
	public void sortString() {
		System.out.println("请输入字符串个数:");
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		String[] arr = new String[n];
		for(int i = 0; i < n; i++) {
			arr[i] = input.next();
		}
		for(int i = 0; i < n-1; i++) {
			for(int j = i+1; j < n; j++) {
				if(arr[i].compareToIgnoreCase(arr[j]) < 0) {
					String str = arr[i];
					arr[i] = arr[j];
					arr[j] = str;
				}
			}
		}
		for(int i = 0; i < n; i++) {
			System.out.print(arr[i] + " ");
		}
		input.close();
	}
	
	//problem 41: the minimun quantity of peaches in beach
	
	 # 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均
	 # 分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
	 # 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把
	 # 多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是
	 # 这样做的,问海滩上原来最少有多少个桃子?
	 
	public void calculateTheMinQuantityOfPeach() {
		int number = 0;
		int n = 1; //最后一只猴子所拿的数量
		for(int i = 0; i < 5; i++) {
			if(i == 0) {
				number = 5*n + 1;
			} else {
				if(number % 4 != 0) {
					n++;
					i = -1;
				} else {
					number = 5*(number/4) + 1;
				}
			}
		}
		System.out.println(number);
	}
	
	//problem 42: 809*??=800*??+9*??+1
	#其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。
	#求??代表的两位数,及809*??后的结果。
	public void getTheValue() {
		String str = "";
		for(int i = 10; i < 100; i++) {
			if(809*i == 800*i + 9*i + 1) {
				str += (i + " ");
			}
		}
		if(str.contentEquals("")) {
			System.out.println("没有符合的数");
		} else {
			System.out.println("合适的有" + str);
		}
	}
	
	#problem 43: 求0—7所能组成的奇数个数。
	public void getTheNumberOfOddNumber() {
		int sum = 0;
		int n = 8;
		//一位数
		sum += n/2;
		//两位数
		sum += (n/2)*(n-1);
		//三位数
		sum += (n/2)*(n-1)*n;
		//四位数
		sum += (n/2)*(n-1)*n*n;
		//五位数
		sum += (n/2)*(n-1)*n*n*n;
		//六位数
		sum += (n/2)*(n-1)*n*n*n*n;
		//七位数
		sum += (n/2)*(n-1)*n*n*n*n*n;
		//八位数
		sum += (n/2)*(n-1)*n*n*n*n*n*n;
		System.out.println(sum);
	}
	
	#problem 44: 一个偶数总能表示为两个素数之和。
	public void anEvenNumberIsSumOfTwoPrimeNumber() {
		System.out.println("请输入一个偶数");
		Scanner input = new Scanner(System.in);
		int num = input.nextInt();
		while(num % 2 != 0) {
			System.out.println("输入的不是偶数,请重新输入");
			num = input.nextInt();
		}
		if(num == 0 || num == 2) {
			System.out.println("0和2不能表示");
		}
		for(int i = 2; i < num; i++) {
			if(isPrimeNumber(i) && isPrimeNumber(num-i)) {
				System.out.println(num + "=" + i + "+" + (num-i));
			}
		}
		input.close();
	}
	
	#problem 45:  判断一个素数能被几个9整除
	public void timesOfDivide() {
		System.out.println("请输入一个素数");
		Scanner input = new Scanner(System.in);
		int num = input.nextInt();
		if(!isPrimeNumber(num)) {
			System.out.println("你输入的不是素数");
		}
		int count = 0;
		while(num > 8) {
			num /= 9;
			count++;
		}
		System.out.println(count);
		input.close();
	}
	
	#problem 46: 两个字符串连接程序
	public void concatTwoString() {
		System.out.println("请输入两个字符串");
		Scanner input = new Scanner(System.in);
		String str = input.next();
		String str1 = input.next();
		System.out.println(str + str1);
		input.close();
	}
	
	#problem 47: 读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*
	public void printStar() {
		System.out.println("请输入7个数(1-50)");
		Scanner input = new Scanner(System.in);
		int[] arr = new int[7];
		for(int i = 0; i < 7; i++) {
			arr[i] = input.nextInt();
			if(arr[i] > 50 || arr[i] < 1) {
				System.out.println("请输入1-50的数");
				input.close();
				throw new RuntimeException();
			}
		}
		for(int i = 0; i < 7; i++) {
			print(arr[i]);
		}
		input.close();
	}
	
	private static void print(int num) {
		for(int i = 0; i < num; i++) {
			System.out.print("*");
		}
		System.out.println();
	}
	
	#problem 48: 某个公司采用公用电话传递数据,数据是四位的整数,
	#在传递过程中是加密的,加密规则如下:每位数字都加上5,
	#然后用和除以10的余数代替该数字,再将第一位和第四位交换,
	#第二位和第三位交换。
	public void encrypteAFourBitNumber() {
		System.out.println("请输入一个四位数字");
		Scanner input = new Scanner(System.in);
		int number = input.nextInt();
		int[] arr = new int[4];
		if(number > 999 && number < 10000) {
			for(int i = 3; i >= 0; i--) {
				arr[i] = (number % 10 + 5) % 10;
				number /= 10;
			}
			int temp = arr[0];
			arr[0] = arr[3];
			arr[3] = temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
			for(int i = 0; i < 4; i++) {
				System.out.print(arr[i]);
			}
			input.close();
		} else {
			input.close();
			throw new RuntimeException();
		}
	}
	
	#problem 49: 计算字符串中子串出现的次数
	public void calculateTheNumberOfSubstringAppearence() {
		System.out.println("请输入字符串");
		Scanner input = new Scanner(System.in);
		String str = input.nextLine();
		char[] ch = str.toCharArray();
		int count = 0;
		for(int i = 0; i < ch.length; i++) {
			if(ch[i] == ' ' && ch[i+1] != ' ') {
				count++;
			}
		}
		count++;
		System.out.println(count);
		input.close();
	}
}

Test.java

public class Test {
	public static void main(String[] args) {
		ProgramImplement test1 = new ProgramImplement();
		test1.sortThreeNumber();
	}
}

IOTest.java

package ProgramPractice;

import java.io.*;
#problem 50: 有五个学生,每个学生有3门课的成绩,
#从键盘输入以上数据(包括学生号,姓名,三门课成绩),
#计算出平均成绩,将原有的数据和计算出的平均分数
#存放在磁盘文件"stud"中。

public class IOTest {
		String[] number = new String[8];
	    String[] name = new String[5];
	    float[][] grade = new float[5][3];
	    float[] sum = new float[5];
	    public static void main(String[] args) throws Exception {
	    	 IOTest stud = new IOTest();
	    	 stud.input();
	    	 stud.output();
	    }
	
	    void input() throws IOException {
	    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    	boolean isRecord = true;
	    	while(isRecord) {
	    		try {
	    			for(int i = 0; i < 5; i++) {
	    				System.out.print("请输入学号:");
	    				number[i] = br.readLine();
	    				System.out.print("请输入姓名:");
	                    name[i] = br.readLine();
	                    for(int j = 0; j < 3; j++) {
	                    	System.out.print("请输入第" + (j+1) + "门课成绩:");
	                        grade[i][j] = Integer.parseInt(br.readLine());
	                    }
	                    System.out.println();
	                    sum[i] = grade[i][0]+grade[i][1]+grade[i][2];
	    			}
	    			isRecord = false;
	    		} catch(NumberFormatException e) {
	    			System.out.println("请输入一个数字!");
	    		}
	    	}
	    }
	
	    void output() throws IOException {
	    	FileWriter fw = new FileWriter("C://Users//hl//Desktop//stud.txt");
	    	BufferedWriter bw = new BufferedWriter(fw);
	    	bw.write("No.  "+"Name  "+"grade1  "+"grade2  "+"grade3  "+"average");
	    	bw.newLine();
	    	for(int i = 0; i < 5; i++){
	    		bw.write(number[i]);
	    		bw.write("  " + name[i]);
	            for(int j = 0; j < 3; j++) {
	            	bw.write("  "+grade[i][j]);
	            }
	            bw.write("  " + (sum[i]/5));
	            bw.newLine();
	    	}
	    	bw.close();
	}
}