1. e294.APCS 類似題 - 小崴的新發現
    1. 題目
    2. 解法

e294.APCS 類似題 - 小崴的新發現

e294.APCS 類似題 - 小崴的新發現

apcs歷屆

題目

pic
先看一下題目,題目要我們把一個數字變成完全奇數再去看跟原本的差多少,甚麼是完全奇數呢?像135, 777, 9753就是,每一位都是奇數就是。

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 1001 -> upper:1111, lower:999 10開頭的話大的補1, 小的10變9
# 13256 -> upp34:13311, lower:13199
# 35001 -> upper:35111, lower:33999 小的要借位0, upper必然解
# 從頭開始看遇到偶數就留, 遇到奇數就找lower或upper, 看誰比較
# 靠近找lower:若10開頭10->>9補9,若非10開頭,0就不用做了, 其他偶數-1
#找upper:遇到偶數+=1,後面補1。
#abs() = 絕對值
# 去模擬多個範例, 用實例去推
def check(n):
n = str(n)
Len = len(n)
if n[0:2] == "10":
lower = "9" * (Len-1)
upper = "1" * Len
#print(lower, upper)
#a1 = abs(int(n) - int(upper))
#a2 = abs(int(n) - int(lower))
#return min(a1, a2)
else:
upper = ""
lower = ""
for i in range(Len):
if int(n[i]) % 2 == 1:
upper += n[i]
lower += n[i]
#a1 = abs(int(n) - int(upper))
#a2 = abs(int(n) - int(lower))
#return min(a1, a2)
else:
if n[i] == "0":
upper += "1" * (Len - i)
#print(upper)
ans = abs(int(n) - int(upper))
return ans
else:
lower += str(int(n[i]) - 1)
lower += "9" * (Len - i - 1)
#print(lower)
#break
upper += str(int(n[i])+1)
upper += "1" * (Len - i - 1)
#print(upper)
break
a1 = abs(int(n) - int(upper))
a2 = abs(int(n) - int(lower))
return min(a1, a2)
#return n

#data = [135, 13256, 35001, 1001, 1, 2, 10, 11, 21]
#for i in data:
# print(check(i))
from sys import stdin
for line in stdin:
print(check(int(line)))

我個人的想法呢?就是將他們判斷一下,如果前面開頭是10開始就將後面大的後面替補成1,小的就掉一位補9,那其他的呢,我們就從左到右去判斷偶數奇數,如果奇數不用動,偶數的話我們就看是不是0,如果0我們其實只要動變大的,因為小的會借位一定差很多,那不是0的話我們就將他後面都放1小的就都放9,接著去做計算哪個差比較小。

ps:怎麼樣解題比較快呢?我個人寫了一段時間發現,多舉例,用例子一定要推過,推多個,找規律,列出來,一步一步寫架構好邏輯或是找到題目上的線索。