【題解】「CF363A」Soroban
哎呀呀,咕值要掉光了,趕快水篇題解(
solution
這題就是個純模擬,首先我們根據輸出樣例看一下輸出算盤的規則。
看數最大的 720
,我們發現,輸出的算盤張這樣(之所以我不用程式碼框而用 \(\KaTeX\) 是因為程式碼框是對不了齊的):
\[\begin{matrix} O & - & | & - & O & O & O & O \\ O & - & | & O & O & - & O & O \\ - & O & | & O & O & - & O & O \\ \end{matrix} \]
其中左面一個珠子代表 \(5\),下面一個珠子代表 \(1\),從 下往上 讀。
先看最高位。
\[\begin{matrix} - & O & | & O & O & - & O & O \\ \end{matrix} \]
看到代表 \(5\) 的珠子是往中間撥的,有兩個代表 \(1\) 的珠子也是往中間撥的,所以最高位就等於 \(5 \times 1 + 1 \times 2 = 7\)
再看十位。
\[\begin{matrix} O & - & | & O & O & - & O & O \\ \end{matrix} \]
代表 \(5\) 的珠子是沒有往中間撥的,有兩個代表 \(1\) 的珠子是往中間撥的,所以十位就等於 \(=5 \times 0 + 1 \times 2 = 2\)
最後看個位。
\[\begin{matrix} O & - & | & - & O & O & O & O \\ \end{matrix} \]
代表 \(5\) 的珠子沒有往中間撥的,代表 \(1\) 的珠子也沒有是往中間撥的,所以個位就等於 \(=5 \times 0 + 1 \times 0 = 0\)
最後相結合
\[\begin{matrix} \text{百位} & \text{十位} & \text{個位}\\ 7 & 2 & 0\\ \end{matrix}=720 \]
那我們就可以打一個表,將 \(1 \sim 10\) 算盤對應的狀態打成表,最後字串輸入一位一位看即可。
Code
/*
Problem:CF363A
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#define line cout << endl
using namespace std;
char n[15];
string abacus[15] =
{
"O-|-OOOO",//0
"O-|O-OOO",//1
"O-|OO-OO",//2
"O-|OOO-O",//3
"O-|OOOO-",//4
"-O|-OOOO",//5
"-O|O-OOO",//6
"-O|OO-OO",//7
"-O|OOO-O",//8
"-O|OOOO-"//9
};
int main () {
cin >> n;
int len = strlen (n);
for (int i = len - 1; i >= 0; i--) { //注意!輸出是從低位到高位!
cout << abacus[n[i] - '0'] << endl;
}
return 0;
}
謝謝。