Java 期中作业解析

Java 期中作业解析

0、一些示例

获取终端用户的一行输入并原样输出

// file name: demo1.java
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s = input.nextLine();
        System.out.println(s);
        input.close();
    }
}

将字符串分解为字符数组

// file name: demo2.java

public class demo2 {
    public static void main(String[] args) {
        String s = "Hello,Human.";
        char[] c = s.toCharArray();
    }
}

判断整数与字符串是否对称

// 函数方法

static boolean 整数对称(int n) {
    int len = 0;
    while (n/Math.pow(10,++len)>=1);

    boolean is = true;
    for (int i=0;i<len/2;i++) {
        if (((n/(int)Math.pow(10,i))%10)!=((n/(int)Math.pow(10,(len-i-1)))%10)) {
            is = false;
        }
    }

    return is;
}
static boolean 字符串对称(String s) {
    int len = s.length();

    boolean is = true;
    for (int i=0;i<len/2;i++) {
        if (s.charAt(i)!=s.charAt(len-i-1)) {
            is = false;
        }
    }

    return is;
}

1、编程实现:根据以下函数关系,对输入的x值计算输出对应的y值。

x的值对应y的值
x<00
0<=x<10x
10<=x<200.5*x+18
x>=20100
// file name: firstSubject.java
import java.util.Scanner;

public class firstSubject {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        double x, y;
        
        x = input.nextInt();
        if (x<0) {
            y = 0;
        } else if (x<10) {
            y = x;
        } else if (x<20) {
            y = 0.5*x+18;
        } else {
            y = 100;
        }
        System.out.println(y);
        input.close();
    }
}

2、编写程序计算1!+2!+3!+...+n!,并输出计算结果。

(要求:n从键盘输入,0<=n<=50,如果输入的n值不在此范围,提示再次输入)

// file name: secondSubject.java
import java.util.Scanner;

public class secondSubject {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(true) {
            int n = input.nextInt();
            if (n<0|n>50) {
                System.out.println("n值不在范围[0,50]内,请重新输入。");
            } else {
                int p = 1;
                long s = 0;
                for (int i = 1;i<=n;i++) {
                    p *= i;
                    s += p;
                }
                System.out.println(s);
                break; // 退出循环
            }
        }
        input.close();
    }
}

3、已知圆周率PIE的计算公式为 \(\frac{\pi}{4}=\frac{1}{1}-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-\frac{1}{11}+...\) 。要求计算圆周率PIE值(精度为1e-6)。

PS:精度是最后一项的绝对值小于1e-6即abs(1/n)<1e-6。

// file name: thirdSubject.java

public class thirdSubject {
    public static void main(String[] args) {
        double s = 0.0;
        int sign = 1;
        double n = 1.0;
        while(!(Math.abs(1/n)<1e-6)) {
            s += 1/n*sign;
            n += 2;
            sign *= -1;
        }
        System.out.println(s*4);
    }
}

4、从键盘输入一行字符串(以换行符结束),要求分别统计里面英文字符的总个数和数字的总个数,并分别输出。

// file name: fourthSubject.java

import java.util.Scanner;

public class fourthSubject {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        char[] arr_c = input.nextLine().toCharArray();
        int str_n = arr_c.length;
        int word_n = 0, num_n = 0;
        
        while (str_n-->0) {
            char c=arr_c[arr_c.length-str_n-1];
            if (c>='a'&c<='z'|c>='A'&c<='Z') {
                word_n++;
            } else if (c>='0'&c<='9') {
                num_n++;
            }
        }
        System.out.println("英文字符的个数:"+word_n);
        System.out.println("数字字符的个数:"+num_n);
        input.close();
    }
}

5、查询水果价格

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。
首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit

用户可以输入编号1~4查询对应水果的单价,用户输入0即退出;输入其他编号,显示此水果没有出售。

// file name: fifthSubject.java

import java.util.Scanner;

public class fifthSubject {
    public static void main(String[] args) {
        boolean isLoop = true;
        Scanner input = new Scanner(System.in);
        
        System.out.println("[1] apple");
        System.out.println("[2] pear");
        System.out.println("[3] orange");
        System.out.println("[4] grape");
        System.out.println("[0] exit");
        
        while (isLoop) {
            int n = input.nextInt();
            switch (n) {
                case 0:
                    isLoop = false;
                    break;
                case 1: 
                    System.out.println("price="+"3.00元/公斤");
                    break;
                case 2: 
                    System.out.println("price="+"2.50元/公斤");
                    break;
                case 3: 
                    System.out.println("price="+"4.10元/公斤");
                    break;
                case 4: 
                    System.out.println("price="+"10.20元/公斤");
                    break;
                default:
                    System.out.println("没有出售此种水果");
            }
        }
        input.close();
    }
}

6、输出1-9999之间所有的完数(原题质因数是错的),并统计总数。

完数:一个数等于它所有因子数的和。例如:6=1+2+3,且6能被1、2、3整除。

解题思路:对于数n,用所有的k(1<=k<=n-1)去除n,将能整除的k至累加起来与n比较,如果相等则n是完数,输出该数,统计总数加1。

// file name: sixthSubject.java

public class sixthSubject {
    public static void main(String[] args) {
        int total = 0; // 完数总数
        System.out.print("1-9999之间所有的完数: ");
        for (int n=1;n<=9999;n++) {
            int sum_k = 0;
            for (int k=1;k<=n-1;k++) {
                if (n%k==0) {
                    sum_k += k;
                }
            }
            if (n==sum_k) {
                System.out.print(n+",");
                total++;
            }
        }
        System.out.println("\n数量: "+total);
    }
}

7、排序:键盘输入一个数字n表示需要排序的总个数,然后输入n个数字,输出排序结果。

(经典排序方法有:冒泡排序、选择排序、插入排序等)

// file name: seventhSubject.java
import java.util.Scanner;
public class seventhSubject {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("n: ");
        int n = input.nextInt();
        int[] arr_n = new int[n];
        System.out.print("arr_n: ");
        while (n-- > 0) {
            arr_n[arr_n.length - n - 1] = input.nextInt();
        }
        n = 0;
        System.out.println("排序前: ");
        do {
            System.out.print(arr_n[n] + ",");
        } while (++n < arr_n.length);
        bubbleSort(arr_n);
        // selectSort(arr_n);
        // insertSort(arr_n);
        System.out.println("\n排序后: ");
        for (int i = 0; i < arr_n.length; i++) {
            System.out.print(arr_n[i] + ",");
        }
        input.close();
    }

    public static void bubbleSort(int[] a) {
        int len = a.length;
        for (int i = 0; i < len - 1; i++) {
            for (int j = 0; j < len - 1 - i; j++) {
                if (a[j] > a[j + 1]) {
                    // 交换两数位置
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }

    public static void selectSort(int[] a) {
        int len = a.length;
        for (int i = 0; i < len; i++) { // 循环次数
            int value = a[i];
            int position = i;
            for (int j = i + 1; j < len; j++) { // 找到最小的值和位置
                if (a[j] < value) {
                    value = a[j];
                    position = j;
                }
            }
            a[position] = a[i]; // 进行交换
            a[i] = value;
        }
    }

    public static void insertSort(int[] a) {
        int len = a.length; // 单独把数组长度拿出来,提高效率
        int insertNum;
        for (int i = 1; i < len; i++) {
            insertNum = a[i];
            int j = i - 1; // 序列元素个数
            // 从后往前循环,将大于insertNum的数向后移动
            while ((j >= 0) && (a[j] > insertNum)) {
                a[j + 1] = a[j]; // 元素向后移动
                j--;
            }
            a[j + 1] = insertNum; // 找到位置,插入当前元素
        }
    }
}

8、输出100-100000之间所有的回文数。例如:121 131 141 1221 2552 12321 23432都是回文数。

问题分析:所谓回文数,即左右对称的数字。本题中可以分为3位数字、4位数字、5位数字。
(1)3位数,只要个位和百位上数字相同即为回文数。
(2) 4位数,要个位和千位数字相同,并且十位数字和百位数字相同。
(3) 5位数,以百位数字为界限,左右两边数字相同,其他高位数字以此类推。

实现1——整数取位

// file name: eighthSubject.java

public class eighthSubject {
    public static void main(String[] args) {
        for (int i=100;i<=100000;i++) {
            int count = 0, n = i;
            while (n>0) {
                n /= 10;
                count++;
            }
            count = (count>0)?count:1;
            int[] arr_i = new int[count];

            for (int j=0;j<count;j++) {
                n = i;
                int w = j+1;
                while (w>1) {
                    n /= 10;
                    w--;
                }
                arr_i[count-j-1] = n%10;
            }
            boolean is = true;
            for (int j=0;j<arr_i.length/2;j++) {
                if(arr_i[j]!=arr_i[arr_i.length-j-1]) {
                    is = false;
                }
            }
            if (is) {
                System.out.println(i);
            }
        }
    }
}

实现2.字符数组

// file name: eightSubjectX.java

public class eighthSubjectX {
    public static void main(String[] args) {
        for (int i=100;i<=100000;i++) {
            char[] arr_c = String.valueOf(i).toCharArray();
            boolean is = true;
            for (int j=0;j<arr_c.length/2;j++) {
                if(arr_c[j]!=arr_c[arr_c.length-j-1]) {
                    is = false;
                }
            }
            if (is) {
                System.out.println(i);
            }
        }
    }
}

9、打印倒三角图案,要求从键盘输入整数n作为行数

n=8

***************
 *************
  ***********
   *********
    *******
     *****
      ***
       *

规律

总行数当前行数(从1开始)左边空格数星号数
nmm-12*(n-m)+1
//file name: ninthSubject.java

import java.util.Scanner;

public class ninthSubject {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        for (int m=1;m<=n;m++) {
            for (int j=1;j<=m-1;j++) {
                System.out.print(" ");
            }
            for (int j=1;j<=2*(n-m)+1;j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        input.close();
    }
}

类似的打印正三角也很简单,按规律写代码即可:

规律

总行数当前行数(从1开始)左边空格数星号数
nmn-m2*m-1
// file name: temp.java
import java.util.Scanner;

public class temp {
    public static void main(String[] args) {
        // n m:1 n-m 2*m-1
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        for (int m = 1; m <= n; m++) {
            for (int j = 1; j <= n - m; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * m - 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        input.close();
    }
}

10、36人搬72块砖。男一人搬4块,女一人搬3块,小孩两人搬一块,一次性搬完,问有多少种搬法?分别输出男、女、小孩的人数。

思路很简单,三个外层 for 循环枚举所有可能,最内层放个 if 判断是否符合条件即可。

//file name: tenthSubject.java
public class tenthSubject {
    public static void main(String[] args) {
        int total = 0;
        final int sum = 72, n = 36;
        for (int a=0;a<=n;a++) {
            for (int b=0;b<=n-a;b++) {
                for (int c=0;c<=n-a-b;c++) {
                    if ((sum-a*4-b*3-c/2.0==0)&(a+b+c==n)) {
                        System.out.println(a+","+b+","+c+";");
                        total++;
                    }
                }
            }
        }
        System.out.println(total);
    }
}

更高效:

//file name: tenthSubjectX.java
public class tenthSubjectX {
    public static void main(String[] args) {
        int total = 0;
        final int sum = 72, people_n = 36;
        for (int a=0;a<=(sum/Math.max(Math.max(4.0, 3.0), 0.5));a++) {
            for (int b=0;(b*3+a*4)<=sum;b++) {
                for (int c=0;(b*3+a*4+c/2.0)<=sum;c++) {
                    if ((sum-a*4-b*3-c/2.0==0)
                       &(a+b+c==people_n)) {
                        System.out.println(a+","+b+","+c+";");
                        total++;
                    }
                }
            }
        }
        System.out.println(total);
    }
}

帮某同学纠正后的代码:

//file name: MyT.java
public class MyT {
    public static void main(String[] args) {
        int b ,g, c;
        int sum = 36;
        int z = 72;
        for (b=0;b<=18;b++) {                   // 72/4=18
            for (g=0;g<=24;g++) {               // 72/3=24
                for (c=0;c<=36;c+=2) {          // max:36
                    if (b+g+c==sum) {           // 总人数为36
                        if (b*4+g*3+c/2*1==z) { // 总共72块砖
                            System.out.println("b"+b+"g"+g+"c"+c);
                        }
                    }
                }
            }
        }
    }
}

粗暴简单 >_<

// 部分代码
int t = 0;
for (int a=1;a<=36;a++)
    for (int b=1;b<=36;b++)
        for (int c=1;c<=36/2;c++)
            if (a+b+c*2==36&&a*4+b*2+c==72) t++;
System.out.println(t);

转载于:https://www.cnblogs.com/unixart/p/9993770.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值