Java-11 – JAVA基础编程练习

【程序21】题目:求1+2!+3!+...+20!的和
程序分析:此程序只是把累加变成了累乘。
1、先求该项阶乘的值
2、累加求

public class Programme21 {
    public static void main(String[] args) {
       int sum=0;//总和
       for (inti = 1; i <= 20;i++) {
           sum+=factorial(i);//累加
       }
       System.out.println(""+sum);
    }
    //求阶乘的实现
    private static int factorial(inti) {
       //求阶乘
       int mult=1;
        for (intj=1 ; j <= i;j++) {
           mult*=j;
        }
       returnmult;//返回阶乘结果
    }
}

【程序22】

题目:利用递归方法求5!。

程序分析:递归公式:f(n)=n*f(n-1)

不断的调用方法,直到最小的值确定

public class Programme22 {
    public static void main(String[] args) {
       System.out.println(Fact(5));//输出结果值
    }
    //递归方法求阶乘的具体代码
    private static int  Fact(inti) {
       if (i==1) {//1的阶乘为1
           return 1;
       }
       returni*Fact(i-1);//不断回调
    }
}


【程序23】

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

public class Programme23 {
    public static void main(String[] args) {
       System.out.println("第五个人的岁数:"+GetAge(5,2));
    }
    //递归方法求第五个人的岁数
    private static int GetAge(intnum, intageMore) {
        if (num==1) {//第一个人岁数为10
           return 10;
       }
       returnGetAge(num-1, ageMore)+ageMore;//每上一个人岁数加2
    }
}


【程序24】

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
程序分析:创建一个五位数数的数组,把输入数字的每位数的值赋值到数组里面  
* 把输入 数字从个位起获取,并且每获取一次之后/10,这样就能分别获取十位百位千位了
 * 把数字打印出来就是题目所求了 

public class Programme24 {
    public static void main(String[] args) {
       System.out.println("请输入一个不大于5位数的数字:");
       Scanner scanner=new Scanner(System.in);
       int num=scanner.nextInt();//获取输入
       int[] arr=new int[5];//创建5位数的数组
       int i=0;
       //循环取位
       do{     
            arr[i]=num%10;
            num=num/10;
            i++;
       }while (num!=0);//只剩下一位时,说明获取完毕,跳出循环
       System.out.println("输入数字串的是"+i+"位数的");
       System.out.println("逆序输出:");
       //打印出数组
       for (intj = 0; j < i;j++) {
           System.out.print(arr[j]+"  ");
       }
       scanner.close();
    }
}


【程序25】

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
程序分析:这个程序跟上一个程序类似。

* 创建一个五位数的数组

* 逐次取位

* 组后判断条件就可以了

public class Programme25 {
    public static void main(String[] args) {
       System.out.println("请输入一个五位数:");
       Scanner scanner=new Scanner(System.in);
       int input=scanner.nextInt();//获取输入的数字
       int arr[]=new int[5];//创建一个大小为5的数组
       int i=4;
       do {//逐次取位
           arr[i]=input%10;
           input/=10;
           i--;
       } while (i>=0);//这里的结束条件写input!=0也是可以的
       //System.out.println(Arrays.toString(arr));
       if (arr[0]==arr[4]&&arr[1]==arr[3]) {
           System.out.println("输入的数是回文数字!");
       }else {
           System.out.println("输入的数不是回文数字!");  
       }
       scanner.close();
    }
}


【程序26】

题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

public class Programme26 {
  public static void main(String[] args) {
       System.out.println("请输入第一个英文字母:");
       Scanner scanner=new Scanner(System.in);
       String input=scanner.next();
       String input2="";
       switch (input) {
           case"m":
              System.out.println("Monday");
              break;
           case"t":
              System.out.println("请输入第二个字母:");
              input2=scanner.next();
              if (input2.equals("u")) {
                  System.out.println("Tuesday");
              }else if (input2.equals("h")) {
                  System.out.println("Thursday");
              } else {
                  System.out.println("你输入的字母有误!");
              }
              break;
           case"w":
              System.out.println("Wednesday");
              break;
           case"f":
              System.out.println("Friday");
               break;
           case"s":
              System.out.println("请输入第二个字母:");
              input2=scanner.next();
              if (input2.equals("u")) {
                  System.out.println("Sunday");
              }else if (input2.equals("a")) {
                  System.out.println("Saturday");
              } else {
                  System.out.println("你输入的字母有误!");
              }
              break;
           default:
              System.out.println("你输入的字母不正确!");
              break;
       }
       scanner.close();
    }
}


【程序27】

题目:求100之内的素数
素数的判断方法:这个数除以2到比它本身少1的数都不能整除,那么这个数就是素数了!

public class Programme27 {
    public static void main(String[] args) {
       int sum=0;
       for (inti = 2; i < 100;i++) {
           if (IsRight(i)) {//如果是素数就打印出来
              System.out.print(i+"  ");
              sum++;
              if (sum%10==0) {//十个一行
                  System.out.println();
              }
           }
       }
       System.out.println("\n共有素数:"+sum+"个");
    }
    //判断该数是不是素数
    private static boolean IsRight(inti) {
        for (intj = 2; j < Math.sqrt(i);j++) {
           if (i%j==0) {
              return false;//不是素数的话,马上返回false
           }
       }
       return true;
    }
}


【程序28】

题目:对10个数进行排序
程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。最后打印出来的数组就是从小到大排列的数组了

public class Programme28 {
    public static void main(String[] args) {
       System.out.println("请输入10个数(用空格隔开):");
       int[] arr=new int[10];
       Scanner scanner=new Scanner(System.in);
       for (inti = 0; i < 10;i++) {
           arr[i]=scanner.nextInt();
       }
       //对数组进行排序
       int temp=0;//交换数
       for (inti = 0; i < 9;i++) {
           for (intj = i+1; j < arr.length;j++) {
              if (arr[i]>arr[j]) {  //如果第一个数比后面的数大就交换
                  temp=arr[i];
                  arr[i]=arr[j];
                  arr[j]=temp;
              }
           }
       }
       System.out.println("排列后的数组:"+Arrays.toString(arr));//Arrays类的包装方法!
    }
}


【程序29】

题目:求一个3*3矩阵对角线元素之和
程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

public class Programme29 {
    public static void main(String[] args) {
       System.out.println("请输入九个数字:");
       Scanner scanner=new Scanner(System.in);
       int[][]arr=newint[3][3];
       //获取矩阵数字
       for (inti = 0; i <3;i++) {
           for (intj = 0; j < 3;j++) {
              arr[i][j]=scanner.nextInt();
           }
       }
       System.out.println("第一条对角线之和:"+(arr[0][0]+arr[1][1]+arr[2][2]));
       System.out.println("第二条对角线之和:"+(arr[0][2]+arr[1][1]+arr[2][0]));
       scanner.close();
    }
}


【程序30】

题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
1、创建两个数组,如果插入的数字比数组最后一个都大,那么插入的数放在新数组最后就可以
 2、如果插入的不是最大,那么和数组前面的数逐一比较,比较到比插入的数大就break

 比如第i个符合条件,那么arrB[i-1]=arrA[i-1],arrB[i]=num,arrB[i+1]=arrA[i]
public static void main(String[] args) {
       System.out.println("请输入一个数字:");
       Scanner scanner=new Scanner(System.in);
       int num=scanner.nextInt();
       int[] arrA={3,5,15,36,84,99};
       int[] arrB=new int[arrA.length+1];
       if (num>arrA[arrA.length-1]) {
           for (inti = 0; i < arrA.length; i++) {
              arrB[i]=arrA[i];
           }
           arrB[arrB.length-1]=num;
       }else {
           for (inti = 0; i < arrA.length; i++) {
              if (num<arrA[i]) {
                  for (intj = 0; j < i; j++) {
                     arrB[j]=arrA[j];
                  }
                  arrB[i]=num;
                  for (intj = i; j < arrA.length;j++) {
                     arrB[j+1]=arrA[j];
                  }
                  break;//这个很重要
              }
           }
       }
       System.out.println("插入一个数后的数组为:"+Arrays.toString(arrB));
       scanner.close();
    }
}