1. 程式人生 > >Python的100道經典演算法題(1)

Python的100道經典演算法題(1)

按照c語言的100道經典演算法題,自己原創寫的,就得是自己的練習題了

【程式1】
題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去掉不滿足條件的排列。

#coding:utf-8
#題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
sum=0
for i in range(1,5,1):
    for j in range(1,5,1):
        for k in range(1,5,1):
            if(i!=j&j!=k):
                sum=sum+1
; print i,j,k # 這裡去重 print sum

執行結果:

1 2 1
1 2 3
1 2 4
1 3 1
1 3 2
1 3 4
1 4 1
1 4 2
1 4 3
2 1 2
2 1 3
2 1 4
2 3 1
2 3 2
2 3 4
2 4 1
2 4 2
2 4 3
3 1 2
3 1 3
3 1 4
3 2 1
3 2 3
3 2 4
3 4 1
3 4 2
3 4 3
4 1 2
4 1 3
4 1 4
4 2 1
4 2 3
4 2 4
4 3 1
4 3 2
4 3 4
36

【程式2】
題目:企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?


程式分析:條件語句的運用,if else

#coding:utf-8
#題目:企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;
# 利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分
# ,可提成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬
# 之間時高於40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提
# 成1.5%,高於100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求
# 應發放獎金總數?
bonus1=100000*0.1
bonus2=bonus1+100000*0.75
bonus4=bonus2+200000
*0.5 bonus6=bonus4+200000*0.3 bonus10=bonus6+400000*0.15 mon = input("請輸入月利潤:\n") if mon<=100000: bonus=mon*0.1 else: if mon<=200000: bonus=bonus1+(mon-100000)*0.075 else: if mon <= 400000: bonus = bonus2 + (mon - 200000) * 0.05 else: if mon <= 600000: bonus = bonus4 + (mon - 400000) * 0.03 else: if mon <= 1000000: bonus = bonus6 + (mon - 600000) * 0.015 else: if mon > 1000000: bonus = bonus10 + (mon - 1000000) * 0.01 print bonus

執行結果:

請輸入月利潤:
120000
11500.0

【程式3】
題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
程式分析:迴圈計算即可,判斷成立即可輸出。首先要判斷是否為正整數。引入math模組算平方根。

#coding:utf-8
import math
#題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?

#第一種解法 判斷x,y開方同時為整數即可
print '解法一'
for i in range(100000):
    if(math.sqrt(i+100)-int(math.sqrt(i+100))==0):
        x = int(math.sqrt(i + 100)) # 開方求x x為浮點數
        if (math.sqrt(i + 268) - int(math.sqrt(i + 268)) == 0):
            y = int(math.sqrt(i + 268))  # 開方求x x為浮點數
            print x,y
            print '該數為%d' %i

#第二種 直接求x*x-y*y=168
print '解法二'
for i in range(10000):
    for j in range(1000):
        if(i*i-j*j==168):
            print i,j
            print '該數為%d' %(i*i-268)

#第三種 標準解法
print '解法三'
for i in range(100000):
    if(math.sqrt(i+100)-int(math.sqrt(i+100))==0):
        x = int(math.sqrt(i + 100)) # 開方求x x為浮點數
        if (math.sqrt(i + 268) - int(math.sqrt(i + 268)) == 0):
            y = int(math.sqrt(i + 268))  # 開方求x x為浮點數
            if(x*x==i+100 and y*y==i+268):
                print x, y
                print '該數為%d' % i

執行結果:

解法一
11 17
該數為21
19 23
該數為261
41 43
該數為1581
解法二
13 1
該數為-99
17 11
該數為21
23 19
該數為261
43 41
該數為1581
解法三
11 17
該數為21
19 23
該數為261
41 43
該數為1581

結果分析:可以看到第二種的時候,多一個結果,原因就是數能取到負數。這裡要判斷一下開方結果是否為正整數,將結果與int()向上取整函式運算一下即可。

【程式4】
題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
程式分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大於3時需考慮多加一天。
原始碼:

#coding:utf-8
#題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
data=raw_input('輸入年月份,格式2016-05-12:')
#字串切割
s=data.split('-')#以-為標誌切割
if(len(s)==3):
    # 賦值
    year = int(s[0])
    mon = s[1]
    day = s[2]
    print mon
    # python沒有switch case 用字典方式
else:
    print '輸入有誤'
da={'1':0,'2':31,'3':59,'4':90,'5':120,'6':151,'7':181,'8':212,'9':243,'10':273,'11':304,'12':334}
def f(x):
    return da.get(x)
sum=int(f(mon))+int(day)
if(year%400==0 or (year%4==0 and year%100!=0)):
    if(int(mon)>=3):
        sum=sum+1
print sum

執行結果:

輸入年月份,格式2016-05-12:1600-3-11
3
71

【程式5】
題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。
.程式分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小

標準解法:

x=input('x=:')
y=input('y=:')
z=input('z=:')
t=0
if(x>y):
    t=x
    x=y
    y=t
if(x>z):
    t = x
    x = z
    z = t
if(y>z):
    t = y
    y = z
    z = t
print x,y,z

python內建排序演算法:
(1)用List的內建函式list.sort進行排序
(2)全域性函式 sorted

list=[x,y,z]
list.sort()
sorted(list)
print list

【程式6】
題目:用*號輸出字母C的圖案。
程式分析:可先用’*’號在紙上寫出字母C,再分行輸出。

【程式7】
題目:輸出特殊圖案,請在c環境中執行,看一看,Very Beautiful!
分析:將ASCII字元轉換為對應的數值即‘a’–>65,使用ord函式,ord(‘a’)
反之,使用chr函式,將數值轉換為對應的ASCII字元,chr(65)

【程式8】
題目:輸出9*9口訣。
程式分析:分行與列考慮,共9行9列,i控制行,j控制列。

程式碼實現:

#coding:utf-8
for i in range(1,10):
    print '\n'
    for j in range(1,10):
        if(i>=j):
            print '%d*%d=%d' % (i, j, i * j),

print後面加,為了不換行輸出
效果:

1*1=1 

2*1=2 2*2=4 

3*1=3 3*2=6 3*3=9 

4*1=4 4*2=8 4*3=12 4*4=16 

5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 

6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 

7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 

8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 

9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

【程式9】
題目:要求輸出國際象棋棋盤。
程式分析:用i控制行,j來控制列,根據i+j的和的變化來控制輸出黑方格,還是白方格。

【程式10】
題目:列印樓梯,同時在樓梯上方列印兩個笑臉。
程式分析:用i控制行,j來控制列,j根據i的變化來控制輸出黑方格的個數

【程式11】
題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
程式分析:斐波那契數列 即1,1,2,3,5,8,13,21…. 第三個數開始下一個數為前面兩個數之和

#coding:utf-8

m1=m2=1
for i in range(25):
    #後一項等於前兩項之和
    m1=m1+m2
    m2=m2+m1
    print m2

執行結果:

3 8 21 55 

144 377 987 2584 

6765 17711 46368 121393 

317811 832040 2178309 5702887 

14930352 39088169 102334155 267914296 

701408733 1836311903 4807526976 12586269025 

【程式12】
題目:判斷101-200之間有多少個素數,並輸出所有素數。
程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。

相關推薦

Python的100經典演算法1

按照c語言的100道經典演算法題,自己原創寫的,就得是自己的練習題了 【程式1】 題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 程式分析:可填在百位、十位、個

機器學習十大經典演算法1C4.5演算法

C4.5演算法是機器學習演算法中的一種分類決策樹演算法,其核心演算法是ID3演算法. C4.5演算法繼承了ID3演算法的優點,並在以下幾方面對ID3演算法進行了改進: 1)用資訊增益率來選擇屬性,克服了用資訊增益選擇屬性時偏向選擇取值多的屬性的不足;   &nbs

劍指Offer演算法1

class Solution { public: bool Find(int target, vector<vector<int> > array) { int i,j; i=0; j=array[0].size()-1;

演算法1——輸出指定字串所有排列組合

題目介紹:輸入給定字串,輸出所有排列可能例如:給定字串為 1234. 輸出所有排列可能:1234 1324 1423 1432。public class Class01 { public static void main(String[] args) {

基礎演算法1—— 題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的四位數?

題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的四位數? 分析題目,要求將1,2,3,4四個數字成各個位數不相同且無重複的四位數,可以寫四個for迴圈,每一個迴圈代表一個位數上的數字,即1——4,再定義一個int型的變數count,初始值為

演算法研究1python實現經典排序演算法並可視化分析複雜度

排序演算法在演算法界是一個怎麼樣的存在?就好像在學術界中數學的地位,說直接用好像用不上,可是不會做起事情來總會捉襟見肘,左支右絀。找工作的時候,有的面試官甚至會讓我們手寫排序演算法。既然排序演算法如此重要,就讓我們一起去夯實基礎,切切實實得掌握它吧。 前言

c語言實用經典1001-10

【程式1】題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?1.程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去      掉不滿足條件的排列。2.程式原始碼:#include<stdio.h> #in

Java易錯1

輸出 col 順序執行 執行 AR new rgs oid hello 檢查程序,是否存在問題,如果存在指出問題所在,如果不存在,說明輸出結果。 public class HelloB extends HelloA { public HelloB() { } {

資料結構與演算法入門1

一、資料結構 資料之間相互存在的一種或多種特定的關係的元素的集合。 邏輯結構 資料物件中資料元素之間的相互關係 1.集合結構 在資料結構中,如果不考慮資料元素之間的關係,這種結構稱為集合結構。 各個元素是平等的,共同屬性是屬於同一個集合 2.線性結構 線性結構中的資料元素之間

劍指offer演算法二維陣列中的查詢

劍指offer演算法題(一) 題目1:二維陣列中的查詢 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 思路分析:  從左上往右下方來解決這個問題  例如在

機器學習十大經典演算法2k-means演算法

1.基本Kmeans演算法[1] [cpp]  view plain  copy 選擇K個點作為初始質心   repeat  

leetcode 刷1--- 兩數之和

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例:   給定 nums = [2, 7, 11, 15], target = 9   因為 nums[0] + nums[1] = 2 + 7 = 9   所以返回 [0

第十二週專案3 - 圖遍歷演算法實現1

/*Copyright (c) 2015, 煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:H1.cpp * 作者:辛志勐 * 完成日期:2015年11月23日 * 版本號:VC6.0 * 問題描述:實現圖遍歷演算法,輸出圖結構的深度優先(DFS)遍歷序列

那些年,面試中常見的資料結構基礎和演算法

前言 這是 資料結構和演算法面試題系列的下半部分,這部分主要是演算法類 包括二分查詢、排序演算法、遞迴演算法、隨機演算法、揹包問題、數字問題等演算法相關內容。本系列完整程式碼在 github 建了個倉庫,所有程式碼都重新整理和做了一些基本的測試,程式碼倉庫地址在這裡: shishujuan/dsalg

牛客661二維陣列查詢

在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 class Solution { public: bool Find(int target,

演算法優化1:基礎知識-凸集,單峰函式,擬凸函式與凸函式,函式凹凸性定義

本文筆記介紹我最近學習的演算法優化的基礎知識,有: 最優化問題的一般形式 約束問題的分類及形式 優化問題的分類 單峰函式(Unimodal function)的定義 擬凸函式(Quasiconvex function)的定義

【精選】JAVA入門演算法

跌倒了,一定要爬起來。不爬起來,別人會看不起你,你也會失去機會。 1.題目:打印出楊輝三角形(要求打印出10行) 什麼是楊輝三角呢?下面這個就是 楊輝三角最大的特性就是每個數字都是該數字肩上的兩個數字之和,這道題經常在學習二維陣列和迴圈控制中出現 我們可以假設

經典演算法題目

1. 用遞迴演算法求解一個數組的最大最小值     輸入    L = [5, 8, 4, 3, 1, -9]     輸出    (8,-9) def max_min(L): end =

演算法練習1動態規劃:買賣股票的最佳時機1

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個演算法來計算你所能獲取的最大利潤。 注意你不能在買入股票前賣出

【精選】JAVA入門演算法

把敬業變成習慣。短期來看是為了僱主,長期來看是為了自己。 1.題目:輸入一行字元,分別統計出其中英文字母、空格、數字和其它字元的個數。 估計統計字元是所有人都做過的題 這裡給出兩種思路,第一種思路是比較ASCII碼,第二種是使用正則匹配 private static