diff --git a/md/0025.md b/md/0025.md new file mode 100644 index 0000000..c7c3095 --- /dev/null +++ b/md/0025.md @@ -0,0 +1,41 @@ +ค่า $A$ กับ $B$ ที่โจทย์กำหนดจะเขียนเป็นเลขยกกำลังของ $10$ ได้เสมอ เราจึงให้ $A = 10^a$ และ $B = 10^b$ เนื่องจากเรารับค่า $A$ และ $B$ มาเป็นตัวเลขไม่ได้ เราจึงรับมาเป็นสตริงแล้วหาค่า $a$ กับ $b$ แทน + +สังเกตว่า $10^n$ คือเลข $1$ ตามด้วย $0$ อีก $n$ ตัวดังนั้นเราสามารถหาค่า $a$ และ $b$ จากความยาวของ $A$ และ $B$ ได้ + +ถ้าเครื่องหมายที่รับมาเป็นเครื่องหมายบวก จะมี 3 กรณีหลัก ๆ คือ +1. $a = b$ จะได้ว่า $A + B = 2 \cdot A$ ซึ่งคือ $2$ ตามด้วย $0$ อีก $a$ ตัว +2. $a > b$ จะได้ว่า $A + B$ คือ $10...010…0$ โดยมี $0$ ระหว่างเลข $1$ อยู่ $a - b - 1$ ตัว และตามหลังเลข $1$ อีก $b$ ตัว +3. $a < b$ เราสามารถสลับค่า $a$ และ $b$ และคิดตามข้อ 2 ได้ เนื่องจากการบวกสลับที่ได้ + +ถ้าเครื่องหมายที่รับมาเป็นเครื่องหมายคูณ เราทราบว่า $10^a \cdot 10^b = 10^{a + b}$ เพราะฉนั้นคำตอบคือ $1$ ตามด้วย $0$ อีก $a+b$ ตัว + +```cpp +#include +using namespace std; + +void zero(int x) { + for (int i = 0; i < x; i++) cout << 0; +} + +int main() { + string A, B; char operation; + cin >> A >> operation >> B; + int a = A.size() - 1, b = B.size() - 1; + if (operation == '+') { + if (a < b) swap(a, b); + if (a == b) { + cout << 2; zero(a); + } + else { + cout << 1; + zero(a - b - 1); + cout << 1; + zero(b); + } + } + if (operation == '*') { + cout << 1; zero(a + b); + } + return 0; +} +```