Pythonの100の経典のアルゴリズムの問題(1)


###c言語の100の経典のアルゴリズムの問題に従って、自分でオリジナルで書いたのは、自分の練習問題でなければなりません【プログラム1】問題:1、2、3、4つの数字があって、何個の互いに異なっていて繰り返しの数字の3桁を構成することができますか?どれくらいですか.プログラム分析:百位、十位、個位に記入できる数字はすべて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("      :
"
) 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】題目:1つの整数、それは100をプラスした後に1つの完全な平方数で、更に168をプラスしてまた1つの完全な平方数で、この数はいくらですか?プログラム分析:ループ計算でいい、判断が成立すれば出力できる.まず正の整数かどうかを判断します.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


**結果分析:**2つ目が見える場合、複数の結果が表示されます.なぜなら、数が負の数になるからです.ここでは,開方結果が正の整数であるか否かを判断し,結果とint()を上方向に整数関数を取って演算すればよい.
【プログラム4】タイトル:ある年ある月ある日を入力し、この日がこの年の何日目かを判断する.プログラム分析:3月5日を例にとると、まず前の2ヶ月を加算し、それから5日を加えて本年の数日目にしなければならない.特殊な場合、閏年で入力月が3より大きい場合は、1日多く加算することを考慮しなければならない.ソース:
#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

分析:pythonのswitchの使い方についてhttp://blog.csdn.net/lw_zhaoritian/article/details/51537675
【プログラム5】題目:3つの整数x,y,zを入力し、この3つの数を小さいから大きいまで出力してください.プログラム分析:最小の数を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.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 '
' 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】タイトル:階段を印刷し、階段の上に2つの笑顔を印刷します.プログラム解析:i制御行,jで列を制御し,jはiの変化に基づいて出力黒格子の個数略を制御する
【プログラム11】タイトル:古典的な質問:ウサギのペアは、生まれてから3ヶ月目から毎月1対のウサギが生まれて、ウサギは3ヶ月目に成長してから毎月また1対のウサギが生まれて、もしウサギはすべて死なないならば、毎月のウサギの総数はいくらですか?プログラム解析:フィボナッチ数列すなわち1,1,2,3,5,8,13,21...3番目の数から次の数までの2つの数の和
#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の間に何個の素数があるかを判断し、全ての素数を出力する.プログラム分析:素数を判断する方法:1つの数でそれぞれ2からsqrt(この数)を除去し、整除できれば、この数は素数ではなく、逆に素数であることを示す.