Java基础编程练习题50题(没更新完会持续更新)

1.古典问题

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一
对兔子,假如兔子都不死,问每个月的兔子总数为多少?

public class Rabbit {
        public static void main(String[] args) {
            int months = 12; // 假设计算12个月的情况
            RabbitArray(months);
        }

        public static void RabbitArray(int months) {
            int[] rabbits = new int[months];

            // 初始情况
            if (months >= 1) {
                rabbits[0] = 1; // 第1个月初,初始只有1对兔子
            }
            if (months >= 2) {
                rabbits[1] = 1; // 第2个月初,还是只有1对兔子
            }

            // 计算每个月的兔子总数
            for (int i = 2; i < months; i++) {
                rabbits[i] = rabbits[i-1] + rabbits[i-2]; // 根据斐波那契数列规律计算
            }

            // 输出结果
            for (int i = 0; i < months; i++) {
                System.out.println("第 " + (i+1) + " 个月的兔子总数为: " + rabbits[i]);
            }
        }
    }

2.判断素数

判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。

public class Prime {
    public static void main(String[] args) {
        int start = 101;
        int end = 200;

        System.out.println("101到200之间的素数有:");
        int count = 0;

        for (int num = start; num <= end; num++) {
            if (isPrime(num)) {
                count++;
                System.out.print(num + " ");
            }
        }

        System.out.println("\n总共有 " + count + " 个素数。");
    }

    // 判断一个数是否为素数的方法
    public static boolean isPrime(int num) {
        if (num <= 1) {
            return false;
        }
        if (num == 2 || num == 3) {
            return true;
        }
        if (num % 2 == 0 || num % 3 == 0) {
            return false;
        }

        int sqrtNum = (int) Math.sqrt(num);
        for (int i = 5; i <= sqrtNum; i += 6) {
            if (num % i == 0 || num % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }
}

3.水仙花数

打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

public class Daffodil {
    public static void main(String[] args) {
//        System.out.println("水仙花数有:");
        for (int num = 100; num <= 999; num++) {
            int hundred = num / 100;       // 百位
            int ten = (num / 10) % 10;     // 十位
            int one = num % 10;           // 个位

            // 计算各位数字的立方和
            double sums = Math.pow(hundred, 3) + Math.pow(ten, 3) + Math.pow(one, 3);

            // 判断立方和是否等于原数
            if (sums == num) {
                System.out.println(num + " 是一个水仙花数");
            }
        }
    }
}

4.分解质因数

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

public class Decompose {
    public static void main(String[] args) {
        int i = 90;
        // 调用方法打印质因数
        print(i);
    }

    public static void print(int i) {
        // 边界条件检查
        if (i <= 1) {
            System.out.println(i + " 不是一个正整数");
            return;
        }

        // 初始化最小的质数k为2
        int k = 2;

        // 打印开始的数字
        System.out.print(i + "=");

        // 当i大于1时继续分解
        while (i > 1) {
            // 如果i能被k整除
            if (i % k == 0) {
                // 打印质因数k
                System.out.print(k);
                // 如果number能被k整除多次,则继续除以k
                while (i % k == 0) {
                    i /= k;
                }
                // 如果不是最后一个质因数,则打印乘号
                if (i > 1) {
                    System.out.print("*");
                }
            }
            // 如果不能被k整除,则k加1
            k++;
        }
    }
}

5.学习成绩表示

利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

public class Grade {
    public static void main(String[] args) {
        int score = 85;
        char grade = (score >= 90) ? 'A' : (score >= 60) ? 'B' : 'C';
        System.out.println("学生成绩为:" + score + "分," + "等级为" + grade);
    }
}

6.求最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数。   

在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,返回较大的数,此数即为最大公约数,最小公倍数为两数之积除以最大公约数

第一种方法:(辗转相除)
Scanner scanner = new Scanner(System.in);

        // 输入第一个数字
        System.out.print("输入第一个正整数(m): ");
        int m = scanner.nextInt();

        // 输入第二个数字
        System.out.print("输入第二个正整数(n): ");
        int n = scanner.nextInt();

        int temp = 0,x = m, y = n;
        if (m < n) {
            temp = m;m = n;n = temp;
        }
        while (m % n != 0) {
            temp = m % n;
            m = n;
            n = temp;
        }
        System.out.println("最大公约数:" + n);
        System.out.println("最小公倍数:" + x*y/n);

第二种方法(从大到小)

 Scanner scanner = new Scanner(System.in);

        // 输入第一个数字
        System.out.print("输入第一个正整数(m): ");
        int m = scanner.nextInt();

        // 输入第二个数字
        System.out.print("输入第二个正整数(n): ");
        int n = scanner.nextInt();

         int min=m<n?m:n;          //找出最小数
        for(int i=min;i>0;i--){     //从大到小除
            if(m%i==0&n%i==0){
                min=i;
                break;         //第一个就是最大公约数,break跳出
            }
        }
        int max=m*n/min;       //最小公倍数
        System.out.println("最大公约数:"+min);
        System.out.print("最小公倍数:"+max);

7.统计

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。  

 Scanner scanner = new Scanner(System.in);

        System.out.print("输入字符串: ");
        String input = scanner.nextLine();

        int letterCount = 0;
        int spaceCount = 0;
        int digitCount = 0;
        int otherCount = 0;

        // 遍历输入字符串中的每个字符
        for (int i = 0; i < input.length(); i++) {
            char ch = input.charAt(i);
            if (Character.isLetter(ch)) {
                letterCount++;
            } else if (Character.isDigit(ch)) {
                digitCount++;
            } else if (Character.isSpaceChar(ch)) {
                spaceCount++;
            } else {
                otherCount++;
            }
        }

        // 输出计数
        System.out.println("字母的个数为: " + letterCount);
        System.out.println("数字的个数为: " + digitCount);
        System.out.println("空格的个数为: " + spaceCount);
        System.out.println("其他字符个数为: " + otherCount);

8.几个数相加有键盘控制

求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制

Scanner sc = new Scanner(System.in);

        // 输入数字 a
        System.out.print("请输入数字 a:");
        int a = sc.nextInt();

        // 输入相加的项数 n
        System.out.print("请输入相加的项数 n:");
        int n = sc.nextInt();

        // 计算 s 的值
        int sum = 0;
        int temp = 0;
        for (int i = 1; i <= n; i++) {
            // 计算当前项的值
            temp = temp * 10 + a;
            sum += temp;
        }

        // 输出结果
        System.out.println("s = " + sum);

9.完数

题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程     找出1000以内的所有完数

方法1
 public static void main(String[] args) {
        System.out.println("1到1000以内的所有完数:");
        for (int i = 1; i < 1000; i++) {
            int t = 0;
            for (int j = 1; j <= i/2; j++) {
                if (i % j == 0) {
                    t = t + j;
                }
            }
            if (t == i) {
                System.out.println(i + " ");
            }
        }
    }
方法2
 public static void main(String[] args) {
        System.out.println("1到1000以内的所有完数:");
        for (int i = 1; i <= 1000; i++) {
            if (isNumber(i)) {
                System.out.println(i);
            }
        }
    }

    // 判断一个数是否是完数
    public static boolean isNumber(int num) {
        if (num <= 1) {
            return false;
        }

        int sum = 1; // 1 是所有数的因子,从2开始找因子
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) {
                sum += i;
                if (i != num / i) {
                    sum += num / i;
                }
            }
        }
        return sum == num;
    }

10.自由落地

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在     第10次落地时,共经过多少米?第10次反弹多高?

方法1
  public static void main(String[] args) {
        double h = 100;
        double s = 100;
        for (int i = 1; i < 10; i++) {
            s = s + h;
            h = h / 2;
        }
        System.out.println("经过的路程:" + s);
        System.out.println("反弹的高度:" + h);
}
方法2
public class Jemp {
            public static void main(String[] args) {
        double height = 100; // 初始高度,单位为米
        int n = 10; // 第10次落地

        double sum = 0;
        for (int i = 1; i <= n; i++) {
            // 落地时的距离累加
            sum += height;

            // 如果不是最后一次落地,计算反弹高度和更新下次落地的高度
            if (i < n) {
                height /= 2; // 反弹高度是上次落地高度的一半
                sum += height; // 反弹后再落地,距离再加上反弹高度
            }
        }

        System.out.println("第10次落地时,共经过的距离:" + sum + " 米");
        System.out.println("第10次反弹的高度:" + height + " 米");
    }
}

11.组成无重复三位数

有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

方法1
public class Number {
    public static void main(String[] args) {
        int count = 0; // 计数器,用于统计符合条件的三位数的个数

        // 外层循环控制百位数字
        for (int i = 1; i <= 4; i++) {
            // 中间循环控制十位数字,确保十位数字不与百位数字相同
            for (int j = 1; j <= 4; j++) {
                if (j != i) { // 十位数字不能与百位数字相同
                    // 内层循环控制个位数字,确保个位数字不与百位和十位数字相同
                    for (int k = 1; k <= 4; k++) {
                        if (k != i && k != j) { // 个位数字不能与百位和十位数字相同
                            int number = i * 100 + j * 10 + k; // 构造三位数
                            System.out.print(number + " "); // 输出符合条件的三位数
                            count++; // 符合条件的数目加一
                        }
                    }
                }
            }
        }
        System.out.println("\n总共有 " + count + " 个互不相同且无重复数字的三位数。");
    }
}
方法2
public class Number {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i < 5; i++) {
            for (int j = 1; j < 5; j++) {
                for (int k = 1; k < 5; k++) {
                    if (i != j && j != k && i != k) {
                        count++;
                        System.out.println(i * 100 + j * 10 + k);
                    }
                }
            }
        }
        System.out.println("共有" + count + "个三位数");
    }
}

12.企业奖金问题

企业发放的奖金根据利润提成。利润(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%提成,从键盘输入当月利润,求应发放奖金总数?   

public class Bonus {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入当月利润(单位:万元):");
        double profit = scanner.nextDouble();

        double bonus = 0; // 初始化奖金

        if (profit <= 10) {
            bonus = profit * 0.1;
        } else if (profit > 10 && profit <= 20) {
            bonus = 10 * 0.1 + (profit - 10) * 0.075;
        } else if (profit > 20 && profit <= 40) {
            bonus = 10 * 0.1 + 10 * 0.075 + (profit - 20) * 0.05;
        } else if (profit > 40 && profit <= 60) {
            bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03;
        } else if (profit > 60 && profit <= 100) {
            bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015;
        } else if (profit > 100) {
            bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01;
        }

        System.out.println("应发放的奖金总数为:" + bonus + " 万元");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值