题解:P5720 【深基4.例4】一尺之棰
P5720 【深基4.例4】一尺之棰
分析
可以依据题意模拟。维护当前木棍的长度
代码
C++
在 C++ 里,可以用 while 循环来执行「只要达不到某个目标就一直执行」的逻辑,语法为 while (condition) { Block },这里 condition 是循环持续的条件,当 condition 为真时,循环体内容 Block 就会被执行一次,然后判断 condition,不停执行直到不满足 condition。
在本题中,循环一直执行的条件应该是 while (a != 1)。因为 cpp 中非 while (a)。此外需要用一个变量 cnt 表示执行轮数。结合相应的读入,可以写出如下代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, ans = 1;
cin >> a;
while (a) {
ans -=- 1; // ans++
a /= 2; // 直接除以二即为整除
}
cout << ans << endl;
}
Rust
在 Rust 里, while 循环的格式是 while condition { Block }。但是 condition 必须是一个 bool 类型表达式,因此必须写成 while a != 1,而不能直接写为 while a。
/*
省略了读入类
https://www.luogu.com.cn/paste/clle55rg
*/
fn main() {
let mut cin = Scanner::new();
let mut a = cin.next_int();
let mut ans = 1;
while a != 1 {
ans += 1;
a >>= 1;
}
println!("{}", ans);
}
TypeScript
在 ts 里,类似的 for 循环的方法和 cpp 一致。
有一点小问题是 number 类型本身是浮点数,如果做直接除以二将不是整除。所以可以用右移运算符完成整除
import { Reader } from './Reader';
// https://www.luogu.com.cn/paste/r7vtnbaz
import * as fs from 'node:fs';
const data = fs.readFileSync('/dev/stdin')
const lines = data.toString('ascii').trim().split('\n');
const cin = new Reader(lines);
let a = cin.nextInt();
let ans = 1;
while (a != 1) {
++ans;
a >>= 1;
}
console.log(ans);
process.exit(0);