總網頁瀏覽量

2018年5月24日 星期四

可列出所有排列數的副函數寫法及模組

➽ 可以想要列出所有排列的字母或數字,用空格分開

Python Code:
import itertools
list1=input('請輸入n個要排列的數,以空格分開==> ').split()
w=[]
w=[str(x) for x in list1] #將輸入的字串改成整數

nums = itertools.permutations(w) # 它是tuple
for x in nums:
    print(x)
# 以上是有用itertools工具
  
#以下是副函式1
def perm_1(head,tail=''):
    if len(head)==0:
        print(tail)
    else:
        for i in range(len(head)):
            perm_1(head[0:i]+head[i+1:],tail+head[i])
perm_1(w)

#以下是副函式2
def perm_2(a,k=0):
    if k==len(a):
        print(a)
    else:
        for i in range(k,len(a)):
            a[k],a[i]=a[i],a[k]
            perm_2(a,k+1)
            a[k],a[i]=a[i],a[k]
perm_2(w)

#以下是副函式3
def perm_3(clst):
    if len(clst)==1:
        return [clst[0]]
    results = []
    for idx, c in enumerate(clst):
        results += [c+substr for substr in perm_3(clst[:idx] + clst[idx+1:])]
    return results
print(perm_3(w))

2018年5月11日 星期五

105學年度彰雲嘉區資訊能力競賽複賽程式設計題Q4(長方形的切割)


一個長寬皆為整數的長方形可以切割成數個相同大小的整數邊長正方形,例如下圖中,一個長12公分、寬6公分的長方形可以切割成72個邊長為1公分的正方形、18個邊長為2公分的正方形、8個邊長為3公分的正方形、或2個邊長為6公分的正方形。本題請輸入長方形的長和寬(單位公分,皆為整數,中間以空格隔開),輸出可以切割成哪幾種整數邊長的正方形,以及這些相同大小正方形的個數各有多少個(可切割之整數邊長正方形的邊長與個數,以空格隔開,依據邊長由小到大之順序逐行列出)


輸入說明
輸入長方形的整數長和整數寬
輸出說明
輸出可切割之整數邊長正方形的邊長與個數(以空格隔開,依邊長由小到大之順序)

範例1輸入:
12 6
範例1輸出:
1 72
2 18
3 8
6 2


Python code:

def gcd(m, n): # 找長與寬的最大公因數
    return m if n == 0 else gcd(n, m % n)
m,n=input().split()
m,n=int(m),int(n)
a=gcd(m,n) #取出長寬的最大公因數
x=[]
 #將最大公因數的因數存在a中
for i in range(1,a+1):
    if (a%i)==0:
        x.append(i)
for k in range(len(x)):
    b=int(m*n/x[k]/x[k]) #b為面積除以小正方形面積,即個數
    print(x[k],b)

2018年5月10日 星期四

我所寫過的dev c++程式執行檔~~

Runge-Kutta Method 解ODE
https://drive.google.com/file/d/0B03tzGyNUd6RcXhJVGJNbFZvajQ/view?usp=sharing

n階水仙花數:
https://drive.google.com/file/d/0B03tzGyNUd6RRVI5OTVtVlY3Yjg/view?usp=sharing

n個正整數找最大公因數:
https://drive.google.com/file/d/0B03tzGyNUd6RVlZQWHV6TzNPOGc/view?usp=sharing

n個數求標準差:
https://drive.google.com/file/d/0B03tzGyNUd6RRklUWFRfcGM5MDg/view?usp=sharing

n筆資料求相關係數:
https://drive.google.com/file/d/0B03tzGyNUd6RM0k1VlhTYWROVnM/view?usp=sharing

Lagrange 插值多項式(指標):
https://drive.google.com/file/d/0B03tzGyNUd6RQXVEZnlUcDBWdEU/view?usp=sharing

Lagrange 插值多項式(陣列):
https://drive.google.com/file/d/0B03tzGyNUd6ROE1xd2E1MHRXM0E/view?usp=sharing

Lagrange 插值多項式圖形:
https://drive.google.com/file/d/0B03tzGyNUd6RYndqVXU5X1ZtUDQ/view?usp=sharing

字元的所有排列:
https://drive.google.com/file/d/0B03tzGyNUd6RT3VXSlB4RkdLcUk/view?usp=sharing

找完全數:
https://drive.google.com/file/d/0B03tzGyNUd6RNENjOC1NWXZXN28/view?usp=sharing

數字位制轉換:
https://drive.google.com/file/d/0B03tzGyNUd6RWnVlNU51bFF3VVE/view?usp=sharing

數字顛倒:
https://drive.google.com/file/d/0B03tzGyNUd6RLURhcXhUcFlGMUU/view?usp=sharing

泡沫排序法:
https://drive.google.com/file/d/0B03tzGyNUd6RU0taZDBmdzM1NjQ/view?usp=sharing

解一元二、三次方程式:
https://drive.google.com/file/d/0B03tzGyNUd6RMXNCLXI1U0JaVHc/view?usp=sharing

海龍公式:
https://drive.google.com/file/d/0B03tzGyNUd6RdFZCUDZKUVZ2Qk0/view?usp=sharing

動態正弦圖形:
https://drive.google.com/file/d/0B03tzGyNUd6RODNoN3I1eW5XNDg/view?usp=sharing

大階乘計算:
https://drive.google.com/file/d/0B03tzGyNUd6RdFZaMFhpVkswTTQ/view?usp=sharing















2018年5月1日 星期二

2017.10月大學程式設計先修檢測 實作題 第四題(物品堆疊,Stacking)

問題描述
某個自動化系統中有一個存取物品的子系統,該系統是將N個物品堆在一個垂直的貨架上,每個物品各佔一層。系統運作的方式如下:每次只會取用一個物品,取用時必須先將在其上方的物品貨架升高,取用後必須將該物品放回,然後將剛才升起的貨架降回原始位置,之後才會進行下一個物品的取用。
每一次升高某些物品所需要消耗的能量是以這些物品的總重來計算,在此我們忽略貨架的重量以及其他可能的消耗。現在有N個物品,第i個物品的重量是w(i)而需要取用的次數為f(i),我們需要決定如何擺放這些物品的順序來讓消耗的能量越小越好。舉例來說,有兩個物品w(1)=1、w(2)=2、f(1)=3、f(2)=4,也就是說物品1的重量是1需取用3次,物品2的重量是2需取用4次。我們有兩個可能的擺放順序(由上而下):
 (1,2),也就是物品1放在上方,2在下方。那麼,取用1的時候不需要能量,而每次取用2的能量消耗是w(1)=1,因為2需取用f(2)=4次,所以消耗能量數為w(1)*f(2)=4。
 (2,1),也就是物品2放在1的上方。那麼,取用2的時候不需要能量,而每次取用1的能量消耗是w(2)=2,因為1需取用f(1)=3次,所以消耗能量數=w(2)*f(1)=6。
在所有可能的兩種擺放順序中,最少的能量是4,所以答案是4。再舉一例,若有三物品而w(1)=3、w(2)=4、w(3)=5、f(1)=1、f(2)=2、f(3)=3。假設由上而下以(3,2,1)的順序,此時能量計算方式如下:取用物品3不需要能量,取用物品2消耗w(3)*f(2)=10,取用物品1消耗(w(3)+w(2))*f(1)=9,總計能量為19。如果以(1,2,3)的順序,則消耗能量為3*2+(3+4)*3=27。事實上,我們一共有3!=6種可能的擺放順序,其中順序(3,2,1)可以得到最小消耗能量19。
輸入格式
輸入的第一行是物品件數N,第二行有N個正整數,依序是各物品的重量w(1)、w(2)、…、w(N),重量皆不超過1000且以一個空白間隔。第三行有N個正整數,依序是各物品的取用次數f(1)、f(2)、…、f(N),次數皆為1000以內的正整數,以一個空白間隔。
輸出格式
輸出最小能量消耗值,以換行結尾。所求答案不會超過63個位元所能表示的正整數。
範例一(第1、3子題):輸入
2
20 10
1 1
範例一:正確輸出
10
範例二(第2、4子題):輸入
3
3 4 5
1 2 3
範例二:正確輸出
19

Python Code:




參考資料:
https://henrybear327.github.io/CodingNotes/contest/apcs/1061028/

😌😌
原本的程式碼,在n>10會逾時,因為我的做法是找出所有的排列,再算出所有的energy,接著取最小值,這種做法是可以的,但是在n大的時候,效率就變差了~~~
網路上參考別人C語言的寫法,再利用泡沫排序法,可找到答案!!!

結論:大學與研究所時,怎麼沒去修演算法呢?