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

· · 题解

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

分析

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

代码

C++

在 C++ 里,可以用 while 循环来执行「只要达不到某个目标就一直执行」的逻辑,语法为 while (condition) { Block },这里 condition 是循环持续的条件,当 condition 为真时,循环体内容 Block 就会被执行一次,然后判断 condition,不停执行直到不满足 condition

在本题中,循环一直执行的条件应该是 a \neq 1,即 while (a != 1)。因为 cpp 中非 0 值均为真,条件也可以直接写成 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 类型本身是浮点数,如果做直接除以二将不是整除。所以可以用右移运算符完成整除 2 的操作。

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);