1. 程式人生 > 實用技巧 >【題解】「CF363A」Soroban

【題解】「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;
}

謝謝。