首页 > 代码库 > JAVA基础50题

JAVA基础50题

package package0530;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Logger;

/**
 * 本类主要用于练习java基础,放松放松
 * @author xinxin
 */
public class FunctionClass {
    static Logger log = Logger.getLogger("FunctionClass");
    /*
     * 程序1:
     * 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
     * 小兔子长到第三个月后每个月又生一对 兔子,假如兔子都不死,
     * 问每个月的兔子总数为多少?
     */
    public static int test1(int n){
        //1 2 3 4 5 6 7  8  9
        //1 1 2 3 5 8 13 21 34
        int[] arr = new int[n+1];
        
        arr[0] = 0;
        arr[1] = 1;
        for(int i = 2;i<=n;i++){
            arr[i] = arr[i-2] + arr[i-1];
        }
        return arr[n]*2;
    }
    
    /*
     * 程序2:
     * 题目:判断101-200之间有多少个素数,并输出所有素数。
     */
    public static void test2(){
        for(int i = 101;i<=200;i++){
            boolean b = true;
            for(int j=2;j<i&&b;j++){
                if(i % j ==0){
                    b = false;
                }
            }
            if(b){
                System.out.println("素数:"+i);
            }
        }
    }
    
    /*
     * 程序3:
     * 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,
     * 其各位数字立方和等于该数本身。
     * 例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
     */
    public static void test3(){
        for(int i = 100;i<1000;i++){
            int b = i/100;
            int s = i%100/10;
            int g = i%10;
            if(i == b*b*b+s*s*s+g*g*g){
                System.out.println("我是水仙花数:"+i);
            }
        }
    }
    
    /*
     * 程序4:
     * 题目:将一个正整数分解质因式。例如:输入90,打印出90=2*3*3*5;
     * 思路:先求这个正整数的所有的质数
     */
    public static void test4(int n){
        List<Integer> li1 = new ArrayList<Integer>();
        List<Integer> li2 = new ArrayList<Integer>();
        //求所有质数
        flag:for(int i=2;i<=n;i++){
            for(int j=2;j<i;j++){
                if(i%j==0){
                    continue flag;
                }
            }
            li1.add(i);
        }
        //求所有质因数
        for(Integer pn:li1){
            int num1 = n%pn;
            int num2 = n/pn;
            while(num1==0){
                li2.add(pn);
                num1 = num2%pn;
                num2 = num2/pn;
            }
        }
        //处理逻辑,拼接字符串
        StringBuilder sb = new StringBuilder();
        sb.append(n+"=");
        for(Integer pn:li2){
            sb.append(pn+"*");
        }
        sb.deleteCharAt(sb.length()-1);
        System.out.println(sb.toString());
    }
    
    /*
     * 程序4:更好的答案
     */
    public static void test4s(int n){
        int k = 1;
        System.out.println(n+"=");
        while(k<=n){
            if(k==n){
                System.out.println(n);
                break;
            }else if(n%k==0){
                System.out.print(k+"*");
                n = n/k;
            }else{
                k++;
            }
        }
    }
    
    /*
     * 程序5:
     * 利用条件运算符的嵌套来完成此题:学习成绩 >=90分的同学用A表示,
     * 60~89分之间用B表示,60分以下用C表示
     */
    public static void test5(double d){
        char c;
        c = d>90 ? ‘A‘ : (d>=60) ? ‘B‘ : ‘C‘;
        System.out.println(c);
    }
    
    /*
     * 程序6:
     * 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
     * 最大公约数记法:(a,b)
     * 最小公倍数记法:[a,b]
     */
    public static void test6(int m,int n){
        int temp = n*m;
        int t = 0;
        while(m%n!=0){//辗转相除法
            t = n;
            n = m%n;
            m = t;
        }
        System.out.println("最大公约数:"+n);
        System.out.println("最小公倍数:"+temp/n);
    }
    
    /*
     * 程序7:
     * 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
     */
    public static void test7(String str){
        char[] ch = str.toCharArray();
        int blank = 0;
        int character = 0;
        int number=0;
        int other=0;
        for(int i = 0;i<ch.length;i++){
             if(ch[i] == ‘ ‘){
                blank++;
             }else if((‘A‘<=ch[i]&&ch[i]<=‘Z‘)||(‘a‘<=ch[i]&&ch[i]<=‘z‘)){
                 character++;
             }else if(‘0‘<=ch[i]&&ch[i]<=‘9‘){
                 number++;
             }else{
                 other++;
             }
        }
        System.out.println("字符串为:"+str);
        System.out.println("英文字符个数:"+character);
        System.out.println("空格的个数:"+blank);
        System.out.println("数字的个数"+number);
        System.out.println("其它字符的个数:"+other);
    }
    
    /*
     * 程序8:
     * 题目:求s = a + aa + aaa + aaaa +aa...a的值,其中a是一个数字。
     * 例如: 2 + 22 + 222 + 2222 + 22222(此时共有5个数字相加)
     *         几个数相加有键盘控制。
     */
    /**
     *
     * @param a 相当于数字a
     * @param n 一共 有多少个数字相加
     */
    //2    3    2+22+222
    public static void test8(int a,int n){
        int temp = a,i=0,sum =0;
        while(i<n){
            sum = sum + temp;
            temp = temp*10+a;
            i++;
        }
        System.out.println("总和为:"+sum);
    }
    
    /*
     * 程序9:
     * 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。
     * 例如:6 = 1+2+3
     * 请找出1000以内的所有完数。
     */
    public static void test9(){
        List<Integer> arr;
        for(int i = 1;i<1000;i++){
            arr = new LinkedList<Integer>();
            for(int j=1;j<i;j++){
                if(i%j==0) arr.add(j);
            }
            int sum = 0;
            for(Integer in:arr){
                sum +=in;
            }
            if(sum==i)
                System.out.println("我是完数:"+i);
        }
    }
    
    /*
     * 程序10:
     * 题目:一个球从100米高度落下,每次落地后反跳回原高度一半;
     *        再落下,求他在第10次落地时,共经过多少米?第10次 反弹多高?
     */
    /*
     * 分析:
     * 第1次落地:共经过  100   米,反弹  50  米;
     * 第2次落地:共经过  200   米,反弹  25  米;
     * 第3次落地:共经过  250   米,反弹  25/2  米;
     * 第4次落地:共经过  275   米,反弹  25/2/2  米;
     * 第5次落地:共经过  287.5   米,反弹  25/2/2/2  米;
     */
    /**
     * @param n 第几次落地
     */
    public static void test10(int n){
        double totalJournay = 100;
        double reboundHeight = 0;
        double initHeight = 100;
        int kk = 1;
        for(int i = 1;i<=n;i++){
             kk *=2;    
             totalJournay +=  2*reboundHeight;
             reboundHeight = initHeight/kk;
        }
        System.out.println("第"+n+"次落地,共经过"+totalJournay+"米  , 反弹高度为"+reboundHeight);
    }
    
    /*
     * 程序11:
     * 题目:有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
     */
    public static void test11(){
        int count = 0;
        for(int i = 1;i<=4;i++){
            for(int j = 1;j<=4;j++){
                for(int k = 1;k<=4;k++){
                    if(i!=j&&i!=k&&j!=k){
                        System.out.println(i*100+j*10+k);
                        count++;
                    }
                }
            }
        }
        System.out.println("count:"+count);
    }
    
    /*
     * 程序12:
     * 题目:企业发的奖金根据利润提成。利润低于或等于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%提成,从键盘输入当月利润,求应发放奖金总数?
     */
    public static void test12(){
        double salary = 0.0;  //奖金
        Scanner sc = new Scanner(System.in);
        Double d = sc.nextDouble();  //利润
        if(d<0){
                try {
                    throw new Exception("你别输入负数啊,朋友!");
                } catch (Exception e) {
                    System.err.println(e.getMessage());
                    return;
                }
        }
        if(d<=10){
            salary = d*0.1;
        }else if(d<20){
            salary = 10*0.1+(d-10)*0.075;
        }else if(d<40){
            salary = 10*0.1 + 10*0.075 + (d-20)*0.05;
        }else if(d<60){
            salary = 10*0.1 + 10*0.075 + 20*0.05 + (d-40)*0.03;
        }else if(d<100){
            salary = 10*0.1 + 10*0.075 + 20*0.05 + 20*0.03 + (d-60)*0.015;
        }else{
            salary = 10*0.1 + 10*0.075 + 20*0.05 + 20*0.03 + 40*0.015 +(d-100)*0.01;
        }
        DecimalFormat df = new DecimalFormat("#.0000");
        System.out.println("当月应发奖金总额为"+df.format(salary)+"万元!");
        System.out.println(String.format("%.4f", salary));
    }
    
    /*
     * 程序13:
     * 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,
     * 请问该数是多少?    
     */
    public static void test13(){
        int i = 0;
        while(true){//写了一个死循环,看看后面怎么跑的
            if(Math.sqrt(i+100)%1==0&&Math.sqrt(i+268)%1==0){
                System.out.println(i);
            }
            i++;//i--;也行
        }
    }
    
    /*
     * 程序14:
     * 题目:输入某年某月某日,判断这一天是这一年的第几天?
     */
    public static void test14(int year,int month,int day){
        int days = 0;
        int sum = 0;
        for(int i=1;i<month;i++){
            switch(i){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                days = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                days = 30;
                break;
            case 2:
                if((year%400)==0||(year%4==0&&year%100!=0)){
                    days = 29;
                }else{
                    days = 28;
                }
                break;
            }
            sum +=days;
        }
        System.out.println(year+"年"+month+"月"+day+"日   是这一年的第"+(day+sum)+"天!");
    }
    
    /*
     * 程序15:
     * 题目:输入3个整数x,y,z,请把这三个数从小到大输出。
     */
    public static void test15(int x,int y,int z){
        int[] arr = new int[]{x,y,z};
        /*选择排序
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }*/
        //冒泡排序
        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 temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    
    /*
     * 程序16:
     * 题目:输出9*9乘法口诀。
     */
    public static void test16(){
        System.err.println("          9*9乘法口诀表");
        System.out.println();
        flag:for(int i=1;i<10;i++){
            for(int j=1;j<10;j++){
                if(i<j){
                    System.out.println();
                    continue flag;
                }
                System.out.print(i+"*"+j+"="+i*j+"\t");
            }
            
        }
    }
    //这种方法实现更方便
    public static void test16s(){
        for(int i = 1;i<10;i++){
            for(int j=1;j<=i;j++){
                System.out.print(i+"*"+j+"="+i*j+"\t");
                if(i==j)
                    System.out.print("\n");
            }
        }
    }
    
    /*
     * 程序17:
     * 题目:猴子吃桃问题。猴子第一天摘下若干个桃子 ,当即吃了一半,
     * 还不过瘾,又多吃了一个,第二天早晨又将剩下的桃子吃了一半,又多吃了
     * 一个。以后每一天早晨都吃了前一天剩下的一半零一个。到第10天早晨想再
     * 吃时,发现只剩下一个桃子了。求第一天共摘了多少?
     */
    public static void test17(){
        /*
         * 10:1
         * 9 :4
         * 8 :10
         * 7 :22
         */
        int s = 1;
        for(int i = 2;i<11;i++){
            s = (s+1)*2;
        }
        System.out.println("第一天共摘了"+s+"个桃子!");
    }
    
    /*
     * 程序18:
     * 题目:两个乒乓球队比赛,各出三人。甲队为a,b,c三人,乙对为x,y,z三人。已抽签决定比赛名单。
     * 有人向队员打听比赛的名单。a说 他不和x比,c不和x、z比。请编程,找出三队赛手的名单。
     */
    /*
     * a-->z
     * b-->x
     * c-->y
     */
    public static void test18(){
        for(char i =‘x‘;i<=‘z‘;i++){
            for(char j =‘x‘;j<=‘z‘;j++){
                for(char k =‘x‘;k<=‘z‘;k++){
                    if(i!=j&&i!=k&&j!=k&&i!=‘x‘&&k!=‘x‘&&k!=‘z‘){
                        System.out.println("a vs "+i+"||b vs "+j+"||c vs "+k);
                    }
                }
            }
        }
    }
    
    /*
     * 程序19:
     * 题目:打印出如下图形(菱形)
     *     *             
     *    *    *
     *   * * *
     *  * * * *
     *   * * *
     *    * *
     *     *
     */
    public static void test19(){
        //上半部分
        for(int i= 1;i<=4;i++){
            for(int j=4;j>i;j--){
                System.out.print(" ");
            }
            for(int k=2*i-1;k>=1;k--){
                System.out.print("*");
            }
            System.out.println();
        }
        //下半部分
        for(int i=3;i>=1;i--){
            for(int j=3;j>=i;j--){
                System.out.print(" ");
            }
            for(int k=2*i-1;k>=1;k--){
                System.out.print("*");
            }
            System.out.println();
        }
    }
    
    /*
     * 程序20:
     * 题目:有一分数序列:2/1 , 3/2 ,5/3,8/5;13/8;21/13
     * 求出这个数列前20项之和。
     */
    public static void test20(){
        double sum = 0;
        double n1 = 2,n2 =1;
        for(int i=1;i<=20;i++){
            sum +=(double)n1/n2;
            double t = n1;
            n1 = n1 + n2;
            n2 = t;
        }
        System.out.println(sum);
    }
    
    /*
     * 程序21:
     * 题目:求1+2!+3!+...+20!的和。
     */
    public static void test21(){
        

        long sum = 0;
        for(int i=1;i<=20;i++){
            long num = 1;
            for(int j=1;j<=i;j++){
                num *=j;
            }
            sum +=num;
        }
        System.out.println("总和为:"+sum);
    }
    
    /*
     * 程序22:
     * 题目:利用递归的方法求5!。
     */
    public static int test22(int n){
        if(n==1){
            return 1;
        }
        return n*test22(n-1);
    }
    
    /*
     * 程序23:
     * 题目:有5个人坐在一起,问第五个人多少岁?
     * 他说他比第四个人大2岁。问第四个人岁数,他说他比第三个人大2岁。
     * 问第三个人,又说比第二个人大2岁。问第二个人,他说他比第一个人大2岁。
     * 问第一个人,他说他是10岁。请问第五个人多大?
     */
    public static void test23(){
        int age = 10;
        for(int i = 1;i<=5;i++){
            age +=2;
        }
        System.out.println("第五个人岁数是 : "+age);
    }
    
    /*
     * 程序24:
     * 题目:给一个不多于5位的正整数,要求:
     * 一、求它是几位数;
     * 二、逆序打印各位数字。
     */
    public static void test24(){
        int num = (int)(Math.random()*99999+1);
        System.out.println(num);
        int len = Integer.toString(num).length();
        LinkedList<Integer> link = new LinkedList<Integer>();
        for(int i = 1;i<=len;i++){
            int remainder = num%10;
            link.add(remainder);
            num = num/10;
        }
        System.out.println(link);
    }
    
    /*
     * 程序25:
     * 题目:一个五位数,判断它是不是回文数。即12321是回文数,个位
     * 与万位相同,十位与千位相同。
     */
    public static void test25(){
        int num = (int)(Math.random()*90000+10000);
        System.out.println(num);
        String strNumber = Integer.toString(num);
        if(strNumber.substring(0, 1).equals(strNumber.substring(4))&&strNumber.substring(1, 2).equals(strNumber.substring(3, 4))){
            System.out.println(strNumber+"是回文数!");
        }else{
            System.out.println(strNumber+"不是回文数!");
        }
    }
    
    /*
     * 程序26:
     * 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,
     * 则继续判断第二个字母。
     */
    /*
     * monday
     * tuesday
     * wednesday
     * thursday
     * friday
     * saturday
     * sunday
     */
    public static void test26() {
        Scanner sc = new Scanner(System.in);
        String str = sc.next().toLowerCase();
        System.out.println("str :" + str);
        char c = str.charAt(0);
        String param = "";
        char c2 = ‘ ‘;
        switch (c) {
        case ‘m‘:
            param = "星期一";
            break;
        case ‘w‘:
            param = "星期三";
            break;
        case ‘f‘:
            param = "星期五";
            break;
        case ‘t‘:
            c2 = new Scanner(System.in).next().toLowerCase().charAt(0);
            if (c2 == ‘u‘)
                param = "星期二";
            if (c2 == ‘h‘)
                param = "星期四";
            System.out.println("你输入 错了!");
            break;
        case ‘s‘:
            c2 = new Scanner(System.in).next().toLowerCase().charAt(0);
            if (c2 == ‘a‘)
                param = "星期六";
            if (c2 == ‘u‘)
                param = "星期日";
            System.out.println("你输入 错了!");
            break;
        default:
            System.out.println("你输入 错了!");
        }
        System.out.println("你输入的字母"+c+c2+"对应的是"+param);
    }
    
    /*
     * 程序27:
     * 题目:求100之内的素数。
     */
    public static void test27(){
        flag:for(int i=2;i<=100;i++){
            for(int j=2;j<=i-1;j++){
                if(i%j==0){
                    continue flag;
                }
            }
            System.out.println("100以内的素数有"+i);
        }
    }
    
    /*
     * 程序28:
     * 题目:对十个数进行排序。
     */
    public static void test28(){
        int[] arr =new int[10];
        for(int i=0;i<arr.length;i++){
            arr[i] = (int)(Math.random()*100+1);
        }
        System.out.println(Arrays.toString(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 t = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = t;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    
    /*
     * 程序29:
     * 题目:求一个3*3矩阵对角线元素之和
     */
    public static void test29(){
        int[][] arr = new int[3][3];
        int sum = 0;
        for(int i=0;i<=2;i++){
            for(int j=0;j<=2;j++){
                arr[i][j] = (int)(Math.random()*100+1);
                System.out.print(arr[i][j]+"\t");
                if(i==j||i+j==2){
                    sum +=arr[i][j];
                }
            }
            System.out.println();
        }
        System.err.println("------------分割线----------------\n"+sum);
    }
    
    /*
     * 程序30:
     * 题目:有一个已经排好序的数组。现输入一个数,要求按照原来的规律将
     * 它插入到数组中。
     */
    public static void test30(){
        //假设现在有一个长度为10的数组,不妨设该数组是倒序排列
        int[] arr = new int[10];
        for(int i=0;i<=9;i++){
            arr[i] = (int)(Math.random()*30+1);
        }
        System.err.println(Arrays.toString(arr));
        //这次我们用选择排序
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]<arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
        //先随机生产一个数
        int key = (int)(Math.random()*100+1);
        System.out.println("key:"+key);
        //假设我们不知道这个数组是正序还是到序
        int[] targetArr;
        if(arr[0]>=arr[9]){
            System.out.println("这个数组是倒序排列的!");
            targetArr = new int[arr.length+1];
            System.out.println("targetArr长度:"+targetArr.length);
            int i;
            for(i=0;i<arr.length;i++){
                if(arr[i]>key){
                    targetArr[i] = arr[i];
                }else{
                    targetArr[i] = key;
                    break;
                }
            }
            for(int j=i+1;j<targetArr.length;j++){
                targetArr[j] = arr[j-1];
            }
            System.out.println("targetArr:"+Arrays.toString(targetArr));
        }else{
            System.out.println("这个数组是正序排列的!");//和上面同理
            targetArr = new int[arr.length+1];
        }
    }
    
    /*
     * 程序31:
     * 题目:将一个数组逆序输出。
     */
    public static void test31(){
        int[] arr1 = new int[10];
        int[] arr2 = new int[10];
        for(int i=0;i<arr1.length;i++){
            arr1[i] = (int)(Math.random()*100+1);
        }
        System.out.println("arr1"+Arrays.toString(arr1));
        for(int i=0;i<arr1.length;i++){
            arr2[i] = arr1[9-i];
        }
        System.out.println("arr2"+Arrays.toString(arr2));
    }
    
    /*
     * 程序32:
     * 题目:取一个整数a从右端开始的4~7位。
     */
    /*
     * 分析:
     * 这个整数a应该大于7位才有意义,随机生成一个7位数吧
     */
    public static void test32(){
        int num = (int)(Math.random()*9000000+1000000);
        System.out.println(num);
        String str = Integer.toString(num);
        char[] ch = str.toCharArray();
        int i = 0;
        System.out.println(ch);
        while(i<ch.length/2){
            char c = ch[i];
            ch[i] = ch[ch.length-1-i];
            ch[ch.length-1-i] = c;
            i++;
        }
        System.out.println(ch);
        String s="";
        for(int j=3;j<=6;j++){
            s += ch[j];
        }
        System.out.println("结果是"+s);
    }
    
    /*
     * 程序33:
     * 题目:打印出杨辉三角
     */
    public static void test33(){
        for(int i=1;i<=10;i++){
        }
    }
    
    /*
     * 程序34:
     * 题目:输入三个数a,b,c,按大小顺序输出。(不妨有小到大吧)
     */
    public static void test34(){
        Scanner sc = new Scanner(System.in);
        System.out.println("请按顺序输入a,b,c:");
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        System.out.println("a="+a+", b="+b+", c="+c);
        if(a>=b){
            if(c>=a){
                System.out.println(b+" "+a+" "+c);
            }else{
                if(c<=b){
                    System.out.println(c+ " "+b+" "+a);
                }else{
                    System.out.println(b+" "+c+" "+a);
                }
            }
        }else{  //a<b
            if(c>=b){
                System.out.println(a+" "+b+" "+c);
            }else
                if(c<=a) System.out.println(c+" "+a+" "+b);
                else System.out.println(a+" "+c+"  "+b);
        }
    }
    
    /*
     * 程序35:
     * 题目:输入数组,最大与第一个元素交换,最小与最后一个元素交换,输出数组。
     */
    public static void test35(){
        //随机生成一个长度为8的数组
        int[] arr = new int[8];
        for(int i=0;i<arr.length;i++){
            arr[i] = (int)(Math.random()*30+1);
        }
        System.out.println(Arrays.toString(arr));
        int max = arr[0],min = arr[0];
        int a=0,b=0;
        for(int i=1;i<arr.length;i++){
            if(max<arr[i]){
                max = arr[i];
                a = i;
            }
            
            if(min>arr[i]){
                min = arr[i];
                b = i;
            }
        }
        System.out.println("max="+max+",a = "+a);
        System.out.println("min="+min+",b = "+b);
        
        if(arr[0]!=arr[a]){
            int temp = arr[0];
            arr[0] = arr[a];
            arr[a] = temp;
        }
        if(arr[arr.length-1]!=arr[b]){
            int temp =arr[arr.length-1];
            arr[arr.length-1] = arr[b];
            arr[b] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }
    
    /*
     * 程序36:
     * 题目:有n个整数,使其前面各数顺序向后移动m个位置,最后m个数变成最前面的m个数。
     */
    public static void test36(int len,int m){
        int st = m;
        int[] arr1 = new int[len];
        int[] arr2 = new int[len];
        int j=0;
        for(int i=0;i<arr1.length;i++){
            arr1[i] = (int)(Math.random()*100+1);
            if(m<len){
                arr2[m] = arr1[i];
                m++;
            }
            if(i>=arr2.length-st){
                arr2[j] = arr1[i];
                j++;
            }
        }
        System.out.println("arr1"+Arrays.toString(arr1));
        System.out.println("arr2"+Arrays.toString(arr2));
    }
    
    /*
     * 程序37:
     * “约瑟夫环”问题
     * 题目:有n个人围成一个圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报3
     * 的人退出圈子,问最后留下来的人是原来的第几号?
     */
    public static void test37(int n){
        List<Integer> list = new LinkedList<Integer>();
        for(int i=0;i<n;i++){
            list.add(i+1);
        }
        System.out.println(list);
        int index = -1;
        while(list.size()>1){
            index = (index+3)%list.size();
            list.remove(index--);
        }
        System.out.println(list.get(0));
    }
    
    /*
     * 程序38:
     * 题目:写一个函数,求一个字符串的长度.
     */
    public static void test38(String str){
        if(str==null){
            try {
                throw new Exception("你输入的数字字符串为空!");
            } catch (Exception e) {
                System.err.println(e.getMessage());
                return;
            }
        }
        char[] ch = str.toCharArray();
        System.out.println(Arrays.toString(ch));
        System.out.println(ch.length);
    }
    
    /*
     * 程序39:
     * 题目:编写一个函数,输入n为偶数时,调用函数求
     * 1/2+1/4+...+1/n;当输入n为奇数时,调用函数
     * 1/1+1/3+...+1/n
     */
    public static void test39(){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        double d = 0;
        if(n%2==0){
            for(int i=1;i<=n/2;i++){
                d +=(double)1/(2*i);
            }
        }else{
            for(int i=1;i<=n;i++){
                if(i%2!=0){
                    d +=(double)1/i;
                }
            }
        }
        System.out.println(d);
    }
    
    /*
     * 程序40:
     * 题目:给一组字符串排序。
     */
    public static void test40(){
        Set<String> set = new TreeSet<String>();
        set.add("abc");
        set.add("abb");
        set.add("bbb");
        set.add("ccc");
        System.out.println(set);
    }
    
    /*
     * 程序41:
     * 题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为5份,多了一个,
     * 这只猴子把多的一个扔进海中,拿走了一份。第二只猴子把剩下的桃子又平均分成5份,又多了
     * 一个,它同样把多的一个扔进海中,拿走了一份。第三、第四、第五只猴子都是这样做的,问海滩上
     * 原来有多少只桃子?
     */
    public static void test41(){
        int i=1;
        while(i<10000){
            int temp = i;
            int count = 1;
            for(int j=1;j<=5;j++){
                if((temp%5)==1){
                    temp = (int) ((temp-1)*0.8);
                    count++;
                    if(count==6){
                        System.out.println(i);
                        break;
                    }
                }
            }
            i++;
        }
    }
    
    /*
     * 程序42:
     * 题目:809*?? = 800*??+9*??
     * 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。
     * 求??代表的两位数,及809*??的结果。
     */
    public static void test42(){
        for(int i =10;i<=99;i++){
            if(809*i==(800*i+9*i) && (8*i>=10 && 8*i<100)&& (9*i>=100 && 9*i<1000)){
                System.out.println(i);
            }
        }
    }
    
    /*
     * 程序43:
     * 题目:求0-7所能组成的奇数的个数。
     * 改为:求0-7所能组成的奇数的个数。(各个位数上的数字不能重复)
     */
    public static void test43(){
        //4  4*6  4*6*6  4*6*6*5  4*6*6*5*4 4*6*6*5*4*3
        //4*6*6*5*4*3*2  
        long lon = 0L;
        for(int i=8;i>0;i--){
            if(i==8)
                lon = 4;
            if(i==7)
                lon = lon+4*6;
            lon +=lon*i;
        }
        System.out.println(lon);
    }
    
    /*
     * 程序44:
     * 题目:一个偶数总能表示为两个素数之和。
     * 转换为:随机生成一个大于等于8的偶数,然后求
     * 它的质数,并且它的质数和等于这个数字。
     */
    public static void test44(){
        int targetNumber = 0;
        while(true){
            targetNumber = (int)(Math.random()*100+1);
            if(targetNumber>=8 && targetNumber%2==0) break;
        }
        System.out.println(targetNumber);
        flag:
        for(int i=2;i<targetNumber;i++){
            if(i%2==1 && ((targetNumber-i)%2==1)){
                for(int j=2;j<i;j++){
                    if(i%j==0){
                        continue flag;
                    }
                }
                for(int j=2;j<targetNumber-i;j++){
                    if((targetNumber-i)%j==0){
                        continue flag;
                    }
                }
                System.out.println(i+"   "+(targetNumber-i));
            }
        }
    }
    
    /*
     * 程序45:
     * 题目:判断一个整数能被几个9整除。
     */
    public static void test45(int num){
        int count=0;
        while(num%9==0){
            count++;
            num /=9;
        }
        System.out.println(num+" 能被 "+count+"个9整除!");
    }
    
    /*
     * 程序46:
     * 题目:两个字符串连接。
     */
    public static void test46(){
        Scanner  sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        StringBuilder sb = new StringBuilder();
        sb.append(str1).append(str2);
        String str = sb.toString();
        System.out.println(str);
    }
    
    /*
     * 程序47:
     * 题目:读取7个数(1-50)的整数值,每读取一个值,程序打印出该值的个数* 。
     */
    public static void test47(){
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<7;i++){
            int temp = sc.nextInt();
            if(!(temp>=1&&temp<=50)){
                System.out.println("请输入1-50的数字");
                return;
            }
            for(int j=1;j<=temp;j++){
                System.out.print("*");
            }
            System.out.println();
        }
    }
    
    /*
     * 程序48:
     * 题目:某个公司采用公用电话传递数据,数据是4位的整数,在传递过程中是加密的,加密规则如下,
     * 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
     */
    public static void test48(int num){
        System.out.println("未加密前的数据是 num :"+num);
        String regex = "[1-9][0-9]{3}";
        String temp = Integer.toString(num);
        if(!(temp.matches(regex))){
            try {
                throw new Exception("该数字不是4位整数");
            } catch (Exception e) {
                System.err.println(e.getMessage());
                return;
            }
        }
        
        int g = num%10;
        int s = num/10%10;
        int b = num/100%10;
        int q = num/1000;
        int[] arr = {q,b,s,g};
        for(int i=0;i<arr.length;i++){
            arr[i] +=5;
            arr[i] %=10;
        }
//        System.out.println(Arrays.toString(arr));
        for(int i=0;i<arr.length/2;i++){
            int t = arr[i];
            arr[i] = arr[arr.length-1-i];
            arr[arr.length-1-i] = t;
        }
        System.out.print("加密后的数据是 num :");
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]);
        }
    }
    /*
     * 程序49:
     * 题目:计算字符串中子字符串出现的次数。
     */
    public static void test49(String fatherStr,String sonStr){
        String[] strArr = fatherStr.split(sonStr);
        System.out.println(strArr.length-1);
    }
    /*
     * 程序50:
     * 题目:有5个学生,每个学生有三门课的成绩,从键盘输入以上数据(包括学生号、姓名、
     * 三门课成绩),计算出平均成绩,把原有的数据和计算出的平均分数存放在磁盘文件“stud”中,
     */
    public static void test50() throws IOException{
        List<String> list = new LinkedList<String>();
        Scanner sc = new Scanner(System.in);
        String temp = null;
        for(int k=0;k<=4;k++){
            System.out.println("请输入有学号、姓名、语文成绩、数学成绩、外语成绩:");
            temp = sc.nextLine();
            String[] strArr = temp.split("\\、");
            double dou = 0.0,avg=0.0;
            for(int i=2;i<strArr.length;i++){
                dou += Double.parseDouble(strArr[i]);
            }
            avg = dou/3;
            list.add(temp+"、"+avg);
            System.out.println(temp+"、"+avg);
        }
        System.out.println(list);
        File file = new File("C:\\Users\\xinxin\\Desktop\\stud.txt");
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
        for(String s:list){
            bw.write(s+"\r\n");
        }
        bw.flush();
        bw.close();
    }
}

JAVA基础50题