解题思路
在 ISO
国际标准中定义了 $A0$ 纸张的大小为 $1189 \text {mm} \times 841 \text {mm}$,将 $A0$ 纸沿长边对折后为 $A1$ 纸,大小为 $841 \text {mm} \times 594 \text {mm}$,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。
将 $A1$ 纸沿长边对折后为 $A2$ 纸,依此类推。
输入纸张的名称,请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称,该名称一定是 $A0$、$A1$、$A2$、$A3$、$A4$、$A5$、$A6$、$A7$、$A8$、$A9$ 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。
输入样例1:
A0
输出样例1:
1189
841
输入样例2:
A1
输出样例2:
841
594
题目大意
题目给定 $A0$ 的长边长 $1189 \text {mm}$、短边长 $841 \text {mm}$。$An$ 的长边长度为 $An - 1$ 的宽度、短边长度为 $An - 1$ 的长度的一半。即若设 $An$ 长 $l _ n$ 宽 $h _ n$,则 $l _ n = h _ {n - 1}, h _ n = \lfloor {l _ {n - 1} \over 2} \rfloor$($n > 0$)。
解题思路
首先把输入的形如 An
的字符串转成数字形式 $n$。然后给 $a, b$ 两个变量附上初值 $\begin {cases} a = 1189 \\\ b = 841 \end {cases}$。
然后进行 $n$ 次以下操作:
- 令 $a ^ \prime = b, b ^ \prime = \lfloor {a \over 2} \rfloor$。
- 再令 $a = a ^ \prime, b = b ^ \prime$。
正 int
型 除以 $2$ 或右移 $1$ 位时会自动向下取整。
AC Code
#include <iostream>
using namespace std;
int n, a = 1189, b = 841; // 赋初值
string s;
int main ()
{
cin >> s, n = s[1] - '0'; // 处理 n
while (n --)
{
swap (a, b), b >>= 1; // 这样的效果相当于「解题思路」里的两步
}
cout << a << endl << b;
return 0;
}
感谢观看!
$$\href {/blog/content/29204/} {\color {MediumSpringGreen} {【寒假每日一题】题解}}$$
nb
b>>=1是什么意思
按位右移一位
把b二进制形式最后一位删除?
可以直接理解为除2
好的谢谢你!