题目
已知山体上的雪球向下滚动时,雪球每向下滚动1的距离,体积会膨胀x倍。
例如,海拔高度为2的、初始大小为1雪球,当它滚到海拔高度为0的地面时,若x= 5其大小会变成1*5*5=25。
现在每个海拔为i的高度都生成了个大小为1的雪球。当它们全部滚动道地面时,请你求出所有雪球的大小总和。答案对取模。
- 输入描述:
在第一行中,给出山的高度T和雪球增加的程度,在第二行到 H + 1行表示在山上生成的雪球数量,其中第 i+1行的数字表示在高度为i处制成的雪球的数量
- 输出描述:输出从山上滚下的所有雪球个数总和。
输入:4 5 输出:**
1
3
2
4
代码(VSCode本地调试)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let H, x;
let snowballs = [];
rl.on('line', (input) => {
if (!H) {
[H, x] = input.split(' ').map(Number);
} else {
snowballs.push(Number(input));
if (snowballs.length === H) {
rl.close();
}
}
});
rl.on('close', () => {
let totalSize = 0;
let size = 1;
for (let i = 0; i < H; i++) {
size = (size * x) % (1e9 + 7);
totalSize = (totalSize + snowballs[i] * size) % (1e9 + 7);
}
console.log(totalSize);
});
解析
在 JavaScript 中,rl.on() 是用于注册事件监听器的方法,通常用于处理用户输入或其他异步操作的回调函数。
rl 是一个 readline 模块创建的 Interface 对象,用于读取用户的输入。
rl.on() 方法接受两个参数:事件名称和回调函数。
事件名称可以是以下之一:
- 'line':当用户输入一行数据时触发。
- 'close':当输入流关闭时触发。
回调函数是一个函数,用于处理事件触发时的逻辑。回调函数的参数根据事件类型而定,例如 'line' 事件的回调函数通常会接收用户输入的数据作为参数。
示例用法:
rl.on('line', (input) => {
// 处理用户输入的一行数据
console.log('用户输入:', input);
});
rl.on('close', () => {
// 处理输入流关闭事件
console.log('输入流已关闭');
});
在上述示例中,当用户输入一行数据时,'line' 事件被触发,回调函数中的代码将被执行。当输入流关闭时,'close' 事件被触发,回调函数中的代码将被执行。
通过使用 rl.on() 方法,我们可以注册事件监听器来处理用户输入或其他异步操作的回调函数,以实现相应的逻辑
代码(赛码网)
let line = readline()
let H, x;
let snowballs = [];
[H, x] = line.split(' ').map(Number);
while (input = readline()) {
snowballs.push(Number(input));
}
let totalSize = 0;
let size = 1;
for (let i = 0; i < H; i++) {
size = (size * x) % (1e9 + 7);
totalSize = (totalSize + snowballs[i] * size) % (1e9 + 7);
}
console.log(totalSize);
首先,通过 readline() 函数读取一行输入,并将其存储在变量 line 中。
接下来,定义了变量 H 和 x,以及一个数组 snowballs,用于存储输入的数据。
通过 line.split(' ').map(Number),将读取的一行输入按空格分割成数组,并使用 map(Number) 将数组中的每个元素转换为数字类型。然后,通过解构赋值将转换后的值分别赋给 H 和 x。
使用 while (input = readline()) { ... },循环读取输入的每一行数据。在循环中,将读取的每一行数据转换为数字类型,并添加到 snowballs 数组中。
接下来,定义变量 totalSize 和 size,并初始化为 0 和 1。
通过一个循环遍历 snowballs 数组,从索引 0 开始,直到索引小于 H。在每次循环中,更新 size 的值为 (size * x) % (1e9 + 7),用于计算下一个雪球的大小。然后,将当前雪球的大小乘以 size,并累加到 totalSize 中。最后,对 totalSize 取模 (1e9 + 7),以保证结果在合理范围内。
最后,使用 console.log(totalSize) 将计算结果打印到控制台。