DAY4 利用循环写(百僧吃百馍)(水仙花数)(猴子吃桃问题)(斐波那契数列:生兔子问题)

一、百僧吃百馍问题:

问题描述:100个和尚吃100个馒头,100个和尚中有大和尚和小和尚,一个大和尚能吃3个馒头,三个小和尚能吃1个馒头,问:大和尚和小和尚各有多少个?

用while实现

程序分析:

馒头food一共100个,每少三个,则代表有一个大和尚,每少一个,则代表有三个小和尚,馒头一直在减少,知道馒头数food=0。

代码实现:

public class Monk_eats_buns {
    public static void main(String[] args) {
        int food = 100;    //馒头数
        int big_monk = 0;  //大和尚数量
        int small_monk = 0;//小和尚数量

        while (food != 0){
            //大和尚一个人吃三个馒头,food-3,大和尚人数big_monk+1
            food -= 3;
            big_monk += 1;

            //此代码可以查看每次大和尚吃完剩下多少个馍,大和尚人数有多少个
//            System.out.println("还剩:" + food + "个馍");
//            System.out.println("大和尚:" + big_monk);

            //小和尚三个人吃一个馒头,food-1,小和尚人数small_monk+3
            food -= 1;
            small_monk += 3;

            //此代码可以查看小和尚吃完还剩多少个馍,小和尚有多少个
//            System.out.println("还剩:" + food + "个馍");
//            System.out.println("小和尚:" + small_monk);
//            System.out.println("-----------------------------------------------------");
        }
        System.out.println("大和尚一共有:" + big_monk + "个");
        System.out.println("小和尚一共有:" + small_monk + "个");
    }
}

二、水仙花数

问题描述:一个三位数,每个数的立方的和等于数字本身,给定一个区间,求区间内所有的水仙花数。

使用for循环实现:

程序分析:

1.定义三个变量,将这个数的个位数,十位数,百位数分别赋值给这三个变量,然后将它们的立方和相加,判断是否等于这个数本身,相等的话,将这个数打印出来。

2.问题:如何将这个数的个位数,十位数,百位数拿出来呢?

实现思路:

  1. 将三位数除以100,得到百位数。
  2. 将三位数除以10取余,得到十位数。
  3. 将三位数除以10,得到个位数。

 代码实现:

public class Narcissus_Number {
    public static void main(String[] args) {
        //定义全局变量
        int num;
        int a;  //百位数
        int b;  //十位数
        int c;  //个位数

        //用for循环来控制范围
        for (num = 100;num <= 999;num++) {
            //求出百位数,十位数,个位数
            a = num / 100;
            b = (num / 10) % 10;
            c = num % 10;

            //判断是否为水仙花数,是的花就打印出来
            if ((a * a * a) + (b * b * b) + (c * c * c) == num) {
                System.out.println(num);
            }
        }
    }
}

三、猴子吃桃问题

问题描述:一堆桃,猴子第一天吃一半多一个,第二天吃了第一天剩下的一半多一个,依次类推,每天都吃前一天剩下的一半多一个,到第十天就剩下一个桃子。求这堆桃子有多少个?

用for循环实现

程序分析:到第十天时,只剩下了1个桃子,所以我们可以从第九天开始算,第九天应该剩下第十天加一个再乘以2,也就是说,第n天应该是第n+1天的桃子数+1个再乘以2。

代码实现:

public class Monky_eat_peach {
    public static void main(String[] args) {
        //第十天,还剩一个
        int peach_sum = 1;
        int day;

        //因为第十天还剩一个,所以从第九天开始算,算出剩下每天有多少个
        for (day = 9;day >= 1;day--){
            peach_sum = (peach_sum + 1) * 2;
            System.out.println("第" + day + "天:" + peach_sum);
        }
        System.out.println(peach_sum);
    }
}

四、斐波那契数列(生兔子问题)

问题描述:假设一对兔子每个月可以生一对小兔子,并且每对小兔子出生后的第二个月开始也可以生小兔子。假设兔子不会死亡,那么一对兔子从出生后第三个月开始,每个月都可以生一对新的兔子。如果一开始只有一对兔子,那么经过n个月后,有多少对兔子?

解决这个问题的方法是使用斐波那契数列。

利用for循环

代码实现:

import java.util.Scanner;
// 程序分析:
// 第一个月:1对兔子;
// 第二个月:1对兔子;
// 第三个月:2;
// 第四个月:3;
// 第五个月:5;
// 第六个月:8;
// 第七个月:13
// f(n) = f(n-1) + f(n-2)  第n个月的兔子数应该等于第n-1个月+n-2个月
public class Fibonacci_series {
    public static void main(String[] args) {

        int month_n;  //代表第n个月
        int month_1 = 1;  //代表第n - 1 个月
        int month_2 = 0;  //代表第n - 2 个月

        Scanner input = new Scanner(System.in);
        System.out.println("请输入月份:");
        int n = input.nextInt();

        for (int month = 1;month <= n;month++){
            if(month == 1){
                System.out.println("第" + month + "个月" + "有1只兔子");
            }else {
                
                month_n = month_1 + month_2;     //第n个月的兔子数等于第n-1个月+第n-2个月的兔子数
                month_2 = month_1;               //进行循环赋值,将第n-2个月的兔子数赋值个下个月的第n-1个月的兔子数
                month_1 = month_n;               //同理,将第n-1个月的兔子数赋值个下个月的第n个月的兔子数
                System.out.println("第" + month + "个月" + "有" + month_n + "只兔子");
            }
            
//            举例:
//            #n = 2时
//            #第2个月:month_n= 0 + 1 = 1
//            #第2-2 = 0个月:month_2 = 0
//            #第2-1 = 1个月:month_1 = 1
//
//            #n = 3时
//            #第3个月:month_n = 1 + 1 = 2
//            #第3 - 2 = 1个月:month_2 = 1
//            #第3 - 1 = 2个月:month_1 = 2
        }
    }
}

本人能力有限,写的不好的地方请指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值