编程题 - 汽水瓶【JavaScript/Node.js解法】

‌"学如逆水行舟,不进则退。"‌ ------《增广贤文》

目录

汽水瓶 题目:

某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。

小张手上有 n 个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
输入描述:

本题将会给出 1<=T <=10 组测试数据,确切数字未知,您需要一直读入直到特定的结尾。每组测试数据描述如下:在一行上输入一个整数 n (0 <= n <=100) ,代表小张手上的空汽水瓶数量。特别地,n=0 代表输入结束,您只需要立即退出,不需要针对这种情况进行处理。
输出描述:

对于每一组测试数据,新起一行。输出一个整数,代表小张最多可以喝到的汽水数量。
示例1:

输入例子:

3

10

81

0

输出例子:

1

5

40
例子说明:

对于第一组测试数据,共有 3 个空瓶,可以换 1 瓶汽水。可以证明无法再做任何兑换,因此最多可以喝到 1 瓶汽水。

对于第二组测试数据:

  • 第一轮兑换,共有 10 个空瓶。可以换 3 瓶汽水,余下 1 个空瓶;
  • 第二轮兑换,刚刚余下 1 个空瓶、加上刚刚兑换的 3 瓶汽水喝完,共有 4 个空瓶。可以换 1 瓶汽水,余下 1 个空瓶;
  • 第三轮兑换,刚刚余下 1 个空瓶、加上刚刚兑换的 1 瓶汽水喝完、再找老板借 1 个空瓶,共有 3 个空瓶。可以换 1 瓶汽水,余下 0 个空瓶。喝完之后不要忘记归还借的空瓶。
  • 综上,一共可以喝到 3+1+1=5 瓶汽水。

解答分析:

可以用来换的瓶子是 总瓶子 / 3 的值,那么现在手里的瓶子就是 没换的瓶子(余数)+ 换来的瓶子。我们进行循环处理直到最后剩下两个瓶子的时候可以借老板一个瓶子,三个瓶子换一瓶汽水,喝完还给老板。而剩下的瓶子小于两瓶的话不做处理。

js代码解答 -ACM模式:

不懂nodejs的readline请点击跳转 -- readline模块详解【Node.js】 作者:幸运小圣

javascript 复制代码
 const readline = require('readline');
 const rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout,
 });

function calculateBottles(val) {
    let totalBottles = 0;
    while (val >= 3) {
        let newBottles = Math.floor(val / 3);
        totalBottles += newBottles;
        val = val % 3 + newBottles;
    }
    if(val == 2){
        totalBottles += 1;
    }
    return totalBottles;
}
async function processInput(){
    for await (const line of rl){
        let val = Number(line);
        if(val == 0){
            break;
        }
        if(val > 2){
           console.log(calculateBottles(val));
        }
        rl.close();
    }
}
processInput();

代码通过:

题解分析:

每次兑换后,都会产生新的空瓶(即喝掉的汽水瓶)。

这些新的空瓶又可以继续兑换,直到空瓶数不足以再兑换为止。

通过观察或数学归纳,我们可以发现一个规律:在允许借瓶的条件下,最多可以喝到的汽水数量大致等于初始空瓶数的一半(当n较大时,这个近似更加准确)。

‌为什么等于总瓶子除以2‌:

  • 这是因为每次兑换都会"消耗"3个空瓶,但"产生"1瓶汽水(即1个新的空瓶)。
  • 从长期来看,每2个空瓶(加上借的1个空瓶)可以"变成"1瓶汽水。
  • 因此,在大量兑换的情况下,最多可以喝到的汽水数量趋近于初始空瓶数的一半。

简洁思路代码:

javascript 复制代码
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });

async function processInput () {
  for await (const line of rl) {
    let val = Number(line);
    if (val === 0) {
      break;
    }
    let maxBottles = Math.floor(val / 2);
    console.log(maxBottles);
    rl.close();
  }
}

processInput();
相关推荐
zhangyao9403304 小时前
关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
开发语言·javascript·excel
骑驴看星星a4 小时前
【Three.js--manual script】4.光照
android·开发语言·javascript
Q_Q5110082858 小时前
python+django/flask的眼科患者随访管理系统 AI智能模型
spring boot·python·django·flask·node.js·php
Q_Q51100828510 小时前
python+django/flask的在线学习系统的设计与实现 积分兑换礼物
spring boot·python·django·flask·node.js·php
devincob10 小时前
js原生、vue导出、react导出、axios ( post请求方式)跨平台导出下载四种方式的demo
javascript·vue.js·react.js
编程社区管理员10 小时前
React 发送短信验证码和验证码校验功能组件
前端·javascript·react.js
学习3人组10 小时前
Node.js 登录接口实现
node.js
葡萄城技术团队10 小时前
迎接下一代 React 框架:Next.js 16 核心能力解读
javascript·spring·react.js
全马必破三10 小时前
React“组件即函数”
前端·javascript·react.js
課代表10 小时前
JavaScript 中获取二维数组最大值
javascript·max·数组·递归·array·最大值·二维