专栏文章

题解:P5720 【深基4.例4】一尺之棰

P5720题解参与者 7已保存评论 7

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
7 条
当前快照
1 份
快照标识符
@mipbxjje
此快照首次捕获于
2025/12/03 09:29
3 个月前
此快照最后确认于
2025/12/03 09:29
3 个月前
查看原文

P5720 【深基4.例4】一尺之棰

分析

可以依据题意模拟。维护当前木棍的长度 aa,当 a1a \neq 1 时,就将 aa 除以二。使用一个循环来维护这个不停除以二的过程,最后循环执行的轮数即为经过的天数。

代码

C++

在 C++ 里,可以用 while 循环来执行「只要达不到某个目标就一直执行」的逻辑,语法为 while (condition) { Block },这里 condition 是循环持续的条件,当 condition 为真时,循环体内容 Block 就会被执行一次,然后判断 condition,不停执行直到不满足 condition
在本题中,循环一直执行的条件应该是 a1a \neq 1,即 while (a != 1)。因为 cpp 中非 00 值均为真,条件也可以直接写成 while (a)。此外需要用一个变量 cnt 表示执行轮数。结合相应的读入,可以写出如下代码:
CPP
#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
RUST
/*
  省略了读入类 
  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 类型本身是浮点数,如果做直接除以二将不是整除。所以可以用右移运算符完成整除 22 的操作。
TYPESCRIPT
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);

评论

7 条评论,欢迎与作者交流。

正在加载评论...