總網頁瀏覽量

2018年3月29日 星期四

利用反矩陣求解

這是一題我在唸成大數研所的Homework,是一個解10個未知數的矩陣題目,當初用C語言來寫反矩陣,光是高斯消去法,就想了2~3天,程式碼起碼有40行以上(可惜找不到了檔案了),但現在用Python,沒幾行就完成了,有很強大的反矩陣指令及矩陣乘法可以用,真是強大~~~~
(雖然我知道matlab解矩陣更快!!!!)






Code:
import numpy as lp

A = [] 
# 讀入矩陣A,每一元素 a_ij=1/(i+j),在此裡階數為10*10
for i in range(1, 11):
    tmp = []
    for j in range(1,11):
        tmp.append(1/(i+j))
    A.append(tmp)
    
b = [] 
#讀入矩陣b,每一元素 b_ij=1/i,在此裡為10*1
for i in range(1, 11):
    b.append(1/i)

#取A的反矩陣
A_inverse=lp.linalg.inv(A) 

# 矩陣相乘,X=b/A
print(lp.dot(A_inverse,b)) 

所得到的10個解為:
1.10013331e+02    -2.97063181e+03   3.43298487e+04      -2.10283001e+05   7.57056679e+05    -1.68241924e+06   
 2.33487030e+06   -1.97010848e+06    9.24273720e+05      
 -1.84859206e+05

2018年3月23日 星期五

2016.10大學程式先修檢測實作題 第三題(定時K彈)






















































@@思考方向:重新定義一新的串列,此串列會移除第i個,然後從第i+1個重新排列

程式碼:
n,m,k=input().split(' ') 
n=int(n)  #輸入n個人
m=int(m)  #每到第m個人就爆炸
k=int(k)  #k個爆彈,炸k次

#每炸掉一個,串列重新編號,成一個新的串列
def remove(list,i): 
    return list[i+1:]+list[0:i]

#n個人編號,1~N
a=[] 
for i in range(1,n+1):
    a.append(i)

# k個炸彈,炸完重新編號,每次炸新串列的第m個人
for j in range(1,k+1): 
    a=remove(a,m-1) #注意是第m個人,所以m-1

#全炸完後,新串列的第一個人即是幸運者
print(a[0]) 

===========================================
@網路看到更簡捷的碼:
data=input().split(' ')
N,M,K=map(int,data)
person=[i for i in range(1,N+1)]
index=0
for i in range(K):
    index=(index+M-1)%len(person)
    del person[index]
    if index==len(person):
        index=0

print(person[index])



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年2月23日 星期五

105學年度彰雲嘉區資訊能力競賽複賽程式設計題Q3(字串反轉)


字串反轉
給定多個由數字或者英文字母構成之字串,你的任務是寫一程式將這些字串依照同樣的順序輸出,但差別是,如果該字串是由純大寫英文字母構成的,那麼你要將這串字母反轉後輸出。

輸入說明 :
輸入多個由數字或者英文字母構成之字串,頭尾會有一對大括號,大括號內的字串會用半形逗號隔開。

輸出說明 :
將字串依照同樣的順序輸出,但如果裡面的成員是由純大寫英文字母構成的,則要將這串字母反轉後輸出。

範例1輸入 :
{WE,342,LOVE,RSKHT,911700,MADNUU}
範例1輸出 :
{EW,342,EVOL,THKSR,911700,UUNDAM}

Python code:
s=input().split(",") #輸入字串,以逗點分開
#題目規定要有大括號,所以要刪掉第一個的{字元
s[0]=s[0].lstrip('{') 
#題目規定要有大括號,所以要刪掉最後一個的}字元
s[len(s)-1]=s[len(s)-1].rstrip('}')
for i in range(len(s)):
    a=s[i].isalpha() #確定為英文字母與大寫,就反轉
    b=s[i].isupper()
    if a==True and b==True:
        s[i]=s[i][::-1]
print('{',end='') #列印時要有{字元
print(s[0],end=',') #列印第一個元素
for k in range(1,len(s)-1):
    print(s[k],end=',')
print(s[len(s)-1],end='}') #列印最後一個元素加}字元



2018年2月12日 星期一

105學年度彰雲嘉區資訊能力競賽複賽程式設計題Q2(找出最小的完全平方數)


找出最小的完全平方數
寫一個程式,輸入整數k (0<k<=10),找出k位數中,所有數字均為偶數的完全平方數中最小的一個數。例如當k=5,五位數中所有數字均為偶數的完全平方數中最小的數為26244(26244=1622) 。
Python code:
# -*- coding: utf-8 -*-

"""
找出最小的完全平方數,但此數的所有數字均需為偶數
1、輸入n,表n組測試資料
2、輸入n組測試資料,表數字的位數
3、輸出n個滿足條件的完全平方數
@author: kujter
"""
import math as lp
def square(n):  #若是完全平方數,回傳1
    a = int(n**0.5)  
    if n==a*a:
        return 1

m=int(input()) #位數
a=[] #儲存完全平方數
x=[] #儲存完全平方數的各位數字
y=[]
z=[]
for i in range(10**(m-1),10**m): #找出完全平方數
    if square(i)==1:
        a.append(i) 
        
for k in range(len(a)):#分解完全平方數的各個數字
    x.append([])
    y.append([])
    z.append([])
    for j in range(m):
        ls=a[k]%10
        x[k].append(ls)
        y[k].append(ls)
        a[k]//=10
    
for p in range(len(a)):
    for q in range(m):
        if (x[p][q]%2)!=0:
            z[p]=x[p]
            
ret=[i for i in y if i not in z] #利用差集,找出滿足條件的完全平方數


for h in range(len(ret)): #將串列反轉及合併取出數字
    ans[h]=[qq for qq in ret[h][::-1]]
    answer=[str(ii) for ii in ans[0]]
    aa=("".join(answer))
    print(aa) 

😊 1、先找出輸入位數的n個完全平方數
   2、再將這些完全平方數分解找出各位數字
   3、判斷各位數字是否偶數
   4、用差集,找出偶數的完全平方數,第一個就是最小的
   5、由於是串列,故需利用合併,再輸出數字       


2018年2月7日 星期三

105學年度彰雲嘉區複賽程式設計題Q1(方格棋盤的走法)


一、方格棋盤的走法
假設輸入一個方格棋盤的寬X與高Y,方格之座標左上角標示為(0,0),右下角標示為(X-1, Y-1)。每次只能往右走一格或者往下走一格,如範例圖形。假設要從左上角(0,0)走到右下角(X-1, Y-1),請問有幾種走法?寫出一個程式從鍵盤輸入兩個整數X,Y (以一個空格分開),其中0<X<=20, 0<Y<=20,輸出走法的個數。

輸入說明 :
輸入第一行為一個整數 n,表示接下來會有n組測試資料。
接下來有 n 行,每行有兩個整數,數字間以一個空格區隔,分別代表方格棋盤的寬及高。
輸出說明 :
輸出走法的個數,每個測試資料輸出一行。
範例1輸入:
2
4 8
8 8
範例1輸出:
120
3432

範例2輸入:
1
6 7
範例2輸出:
462


Python code:
"""
利用遞迴寫組合數C(n,m),並解方格棋盤走法問題
"""
def C(n,m):
    if n<m:
        return 0
    elif m==0 or n==m:
        return 1
    else:
        return C(n-1,m)+C(n-1,m-1)
k=int(input())
c=[]
d=[]
for i in range(k):
    a,b=(int(x) for x in input().split())
    c.append(a)
    d.append(b)
for i in range(k):
    print(C(c[i]+d[i]-2,c[i]-1))

😊 這題不是常見的走線上捷徑的問題,而是走格子內,所以在輸入的長跟寬,都需減1,再取組合數,才是正解。

2018年2月5日 星期一

105學年度台中區資訊能力競賽程式題Q1(計算字串間隔距離)

給定一個由大小寫英文字母所組成的字串以及一個英文字母,請輸出該字母在這個字串中出
現的間隔距離,如
ABCDAAEFeDaBDCBCBcBCbCBBd
A
4 1 5

Python code:
m=input() #輸入字串
a=input() #輸入字母
b=[]#存入各字母編號
for i in range(len(m)):
    if m[i]==a.upper() or m[i]==a.lower():
        b.append(i)
for j in range(len(b)-1):
    print(b[j+1]-b[j],end=' ')