UVa:107 - The Cat in the Hat

本文通过解析一道关于猫的身高和数量的数学问题,详细介绍了如何使用对数和等比数列的知识来解决该问题,并提供了完整的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始没读懂题目,英文一直是硬伤。

题目大意是:有一只(聪明的)猫要打扫房间,但不想自己一个人干,于是让它帽子里的猫出来帮忙(它会魔法?),它帽子里的猫的帽子里还有猫,它帽子里的猫的帽子里的猫的帽子里还有猫,等等。打扫房间的工作量不大,不需要那么的猫来帮忙,于是这只(聪明的)猫想到一个注意:“随着帽子的逐层变小,猫的身高也逐渐变小,会变到最小身高1,由身高为1的猫来打扫房间(嘻嘻……不用自己干咯)。“

在每层帽子里的猫的数量是个常数,N。每层帽子里的猫的身高是上一层的猫的身高的1/(N+1)倍。

猫的身高最小只能是1;

结果一定有猫要去打扫房间;

所有的猫的身高都为整数。

会给定最初那只猫(那只聪明的猫)的身高和要打扫房间的猫(身高为1的猫)的数量,请找出不用打扫房间的猫的数量及所有的猫的身高的总和。


解题思路:

首先如下写几组数据,推导出公式log(N+1)(firstHeight )  = log(N)(workers) = x,即 ln(firstHeight) * ln(N)  =  ln(workers) * ln(N + 1)

height:   h    h/(N+1)   h/(N+1)^2   h/(N+1)^3   h/(N+1)^4   ……   h/(N+1)^x = 1

amount:1          N             N^2              N^3              N^4        ……    N^x = workers

当workers = 1  即  N = 1 时,log(N)(workers) = 1或0,存在二义性, 因此此时:

notWorkers = log(2)(firstHeight) ,即等于指数x,因notworkers为整数,需利用ceil函数进行取整操作;

sumOfHeight = 2 * firstHeight - 1  ,由等比数列求和公式化计算化简得出。

当workers != 1 时:

notWorkers = (workers - 1) / (N - 1)  ,由等比数列求和公式化计算化简得出;
sumOfHeight = (N + 1) * firstHeight - workers * N  ,由等比数列求和公式化计算化简得出。


#include<stdio.h>
#include<math.h>
int main() {
    int firstHeight, workers;
    while (scanf("%d%d", &firstHeight, &workers) != EOF) {
        if (!firstHeight && !workers)
            break;
        int notWorkers, sumOfHeight;
        if (workers == 1) {
            notWorkers = ceil(log(firstHeight) / log(2));
            sumOfHeight = 2 * firstHeight - 1;
        }
        else {
            int N;
            for(N = 1; N < firstHeight; N++) {
                if (fabs(log(firstHeight) * log(N) - log(workers) * log(N + 1)) < 1e-8)
                    break;
            }
            notWorkers = (workers - 1) / (N - 1);
            sumOfHeight = (N + 1) * firstHeight - workers * N;
        }
        printf("%d %d\n", notWorkers, sumOfHeight);
    }
    return 0;
}

--------------------------------------------------------------------------------------------

          Keep It Simple,Stupid!

--------------------------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值