總網頁瀏覽量

顯示具有 2017.3月APCS實作題(完) 標籤的文章。 顯示所有文章
顯示具有 2017.3月APCS實作題(完) 標籤的文章。 顯示所有文章

2018年6月21日 星期四

2017.3月大學程式設計先修檢測 實作題 第三題(數字龍捲風)


Python Code:
n=int(input()) #奇方陣的階數
k=int(input()) #起始方向 0左 1上 2右 3下
a=[] #輸入的奇方陣
out=[] #列印的奇方陣
for i in range(n): #輸入N*N的二維方陣
    data=input().split() #分離字串
    d=[x for x in data] 
    a.append(d)
direction=[[0,-1],[-1,0],[0,1],[1,0]]
s=1
walk=0
s2=0
x=y=n/2
while (x>=0 and y>=0 and x<n and y<n):
    x=int(x)
    y=int(y)
    out.append(a[x][y])
    if (walk==s):
        k=(k+1)%4
        walk=0
        s2+=1
        if(s2==2):
            s+=1
            s2=0
    x+=direction[k][0]
    y+=direction[k][1]
    walk+=1
for i in range(len(out)):
    print(out[i],end='')

👷 很有難度的一題,參考人家的C語寫法,才能把它coding 
     出來~~~

2018年6月18日 星期一

2017.3月大學程式設計先修檢測 實作題 第四題(基地台)


Python Code:
n,k=input().split()#輸入n個服務點與k個基地台
n,k=int(n),int(k) #整數化
a=[] #存入服務點的串列
p=input().split() #將n個服數點串列化及數字化
a=[int(x) for x in p]
a=list(set(a)) #去除重複的元素
a=sorted(a) #服務點排序
l=1 #利用二分搜尋法,令最小直徑為1
r=((a[n-1]-a[0])/k)+1 #最大直徑,當只有一個基地台時的直徑
r=int(r)
while(l<r):
    s=-1 #最小比較值
    base=0 #先讓基地台為0台
    m=(l+r)/2
    m=int(m)
    for i in range(n): # 若服務點的位置比較大,需增設基地台
        if a[i]>s:
            s=a[i]+m
            base+=1
    if base<=k:
        r=m
    else:
        l=m+1
print(r)

Q1:如何找出這k個基地台位置?
Q2:若將這k個基地台平面化,如何找到基地台位置?

2018年3月8日 星期四

2017.3月大學程式設計先修檢測 實作題 第二題(小群體)

問題描述
Q同學正在習程式, P老師出了以下的題目讓他練習。
一群人在起時經常會形成個的小 群體。假設有 體。假設有 體。假設有 N個人,編號由 個人,編號由 個人,編號由 0到 N-1,每 個人都寫下他最好朋友的編號(有可能是自己,如果沒其 個人都寫下他最好朋友的編號(有可能是自己,如果沒其 個人都寫下他最好朋友的編號(有可能是自己,如果沒其 個人都寫下他最好朋友的編號(有可能是自己,如果沒其 他好友), 他好友), 在本題中, 每個人的 好友編號絕對不會重複,也就是說 好友編號絕對不會重複,也就是說 0到 N-1每個數字 都恰好 出現一次 出現一次 。
如:
好友編號
序號          0  1  2  3  4  5  6  7  8  9
好友編號  4  7  2  9  6  0  8  1  5  3

0的好友是 4,4的好友是 6,6的好友是 8,8的好友是 5,5的好友是 0,所以 ,所以 ,所以 0、4、 6、8、和 5就形成了一個小群體。另外, 1的好友是 7而且 7的好友是 1,所以 1和 7形成另一個小 群體, 同理3和 9是一個小 群體,而 2的好友是自己,因此他 的好友是自己,因此他 自己 是一個小 群體。總而言之, 。總而言之, 。總而言之, 。總而言之, 在這 個例子 裡有 4個小 群體:{0,4,6,8,5}、{1,7} 、{3,9} 、 {2} 。

範例一:輸入 範例一:輸入
10
4 7 2 9 6 0 8 1 5 3
範例一:正確輸出 範例一:正確輸出
4
(說明)
4個小 群體是 {0,4,6,8,5 }, {1,7 }, {3,9 }和 {2}。
範例二:輸入 範例二:輸入
3
0 2 1
範例二:正確輸出 範例二:正確輸出
2
(說明)
2個小 群體分別是 {0},{1,2 }。

Code:
n=int(input()) #輸入好友個數
data=input() 
list=data.split(' ') # 將好友編號分開
w=[] #記錄好友編號
v=[] #記錄是否追蹤過
flag=0 #小群體個數
w=[int(x) for x in list] #將輸入的字串變整數
for i in range(n):
    v.append(0) #一開始都沒追蹤,設為0

for j in range(n):
    if v[j]==0: #從沒追蹤的開始追蹤,追蹤過的變為1
        if w[j]==j:#自己是自己的好友,算一個小群體
            flag+=1  #小群體直接加1
            v[j]=1#追蹤過的變為1
        else: #有其它人為好友
            nextone=j #用nextone來當暫存數
            while v[nextone]==0:#當沒拜訪過就繼續拜訪
                v[nextone]=1 #拜訪過的變為1
                nextone=w[nextone] #一直循環到成一小群體
            flag+=1 #成一小群體加1
    
print(flag) #印出小群體個數

😁 程式要寫註解,不然事後來看,就得多花時間才看得懂了!!!

2018年1月9日 星期二

2017.3月大學程式設計先修檢測 實作題 第一題(秘密差)

問題描述
將一個十進位正整數的奇和稱為 A,偶數位的和稱為 ,偶數位的和稱為 B,則 A與 B的絕 對差值 |A -B| 稱為這個正整數的秘密差。 稱為這個正整數的秘密差。
例如: 263541 的奇數位和 A = 6+5+1 12A = 6+5+1 12A = 6+5+1 12A = 6+5+1 12A = 6+5+1 12 A = 6+5+1 12A = 6+5+1 12A = 6+5+1 12 A = 6+5+1 12A = 6+5+1 12A = 6+5+1 12 ,偶數位的和 B = 2+3+4 9B = 2+3+4 9B = 2+3+4 9B = 2+3+4 9B = 2+3+4 9 B = 2+3+4 9 B = 2+3+4 9 B = 2+3+4 9B = 2+3+4 9B = 2+3+4 9,所以 263541 的秘密差是 |12|12 -9|= 39|= 39|= 39|= 3 。
給定一個 十進位正整數 X,請找出 X的秘密差 秘密差 。
輸入 格式
輸入 為一行含 有一 個十進位表示法的 正整數 X,之後是一個換行字元 。
輸出 格式
請輸 出 X的秘密差 Y(以十進位表示法輸出 ),以換行字元結尾 。
範例一:輸入 範例一:輸入
26354 1
範例一:正確輸出 範例一:正確輸出
3
(說明) 263541 的 A = 6+5+1 12A = 6+5+1 12 A = 6+5+1 12 A = 6+5+1 12 A = 6+5+1 12 A = 6+5+1 12 ,B = 2+3+4 9B = 2+3+4 9 B = 2+3+4 9 B = 2+3+4 9B = 2+3+4 9 B = 2+3+4 9 B = 2+3+4 9 ,|A -B|= B|= B|= B|= |12|12 -9|= 39|= 39|= 39|= 3 。
範例二:輸入 範例二:輸入
131
範例二:正確輸出 範例二:正確輸出
1
(說明) 131 的 A = 1+1 2A = 1+1 2 A = 1+1 2 A = 1+1 2 A = 1+1 2 ,B = 3B = 3B = 3B = 3 ,|A -B|= B|= B|= B|= |2 -3|= 13|= 13|= 13|= 1 。

程式碼:
import math as lp
n=input()
n=int(n)
d=lp.floor(lp.log10(n))+1
x=[]
for i in range(d):
      ls=n%10
      x.append(ls)
      n//=10
A=0 #奇數位數和
B=0 #偶數位數和
S=0 #奇數位的奇數位數和
if (d%2)==0:
      for j in range(int(d/2)):
            A+=x[2*j]
            B+=x[2*j+1]
      print(abs(A-B))
elif (d%2)==1:
      for k in range(int((d-1)/2)):
            A+=x[2*k]
            S=A+x[d-1]
            B+=x[2*k+1]
      print(abs(S-B))