1. 程式人生 > >判斷和循環

判斷和循環

判斷循環

1、打印100以內的斐波那契數列(這個數列從第3項開始,每一項都等於前兩項之和)

(1) 第一次實現:

a = 1
b = 1
sum = a + b
print(a)
print(b)
print(sum)
for j in range(i):
    b = sum - b
    sum = sum + b
    for i in range(1,101):
        if i == sum:
            print(i) 

(2)第二次實現:

a = 1
b = 1
print(a)
print(b)
for i in range(1,101):
    if i == a + b:
        print(i)
        a = b
        b = i

(3)第三次實現:

a = 0
b = 1
c = 1
while c:
    c = a + b
    if c > 100:
        break
    print(c)
    a = b
    b = c

(4)第四次實現:

a = 0
b = 1
while b < 100:
    print(b)
    a,b=b,a+b   # a = b , b = a + b

2、求斐波那契數列第101項

(1)第一次實現:

a = 1
b = 1
sum = a + b
count = 0
for j in range(102):
    b = sum - b
    sum = sum + b
    count += 1
    if count == 98:
        print(sum)

(2)第二次實現:

a = 1
b = 1
count = 2
while True:
    sum = a + b
    a = b
    b = sum
    count += 1
    if count == 101:
        break
print(sum)

(3)第三次實現:

a = 0
b = 1
count = 0
while True:
    a,b=b,a+b
    count += 1
    if count == 100:
        print(b)
        break

(4)第四次實現:

a = 0
b = 1
count = 0
while True:
    c = a + b
    count += 1
    a = b
    b = c
    if count == 100:
        print(c)
        break

(5)第五次實現:

a = 1
b = 1
for count in range(99):
    a,b=b,a+b
else:
    print(b)

3、打印一個邊長為n的正方形

(1)第一次實現:

a = int(input("請輸入邊長長度:"))
print(a*"*")
for i in range(a-2):
    print("*"+(a-2)*" "+"*")
print(a*"*")

(2)優化實現:

n =int(input(">>>"))
for i in range(n):
    if i == 0 or i == n-1:
        print(n*"*")
    else:
        print("*"+" "*(n-2)+"*")

4、求1到5階乘之和

(1)第一次實現:重復進行階乘的累加,效率不高

n = int(input(">>>"))
sum = 0
for i in range(1,n+1):
    tmp = 1
    for j in range(1,i+1):
        tmp *= j
    sum += tmp
print(sum)

(2)第二次實現:

n = int(input("please input number:"))
c = 1
sum = 0
for i in range(1,n+1):
    c = i * c
    sum += c
print(sum)

5、給一個數,判斷它是否是素數(質數)一個大於1的自然數只能被1和它本身整除

避開3,5,10,2的倍數,能被這些數整除的都不是質數
從2到n的開平方,以外的數都不用去計算
(1)第一次實現:

num = int(input(">>>"))
for i in range(2,num):
    if num%i == 0:
        print("這不是一個素數")
        break
else:
    print("這是一個素數")

(2)第二次實現:

num = int(input(">>>"))
for i in range(2,int((num**0.5)+1)):
    if num % i == 0:
        print("This is not a prime number")
        break
else:
    print("This is a prime number")

6、打印菱形






  • (1)第一次實現:

    a = 3
    b = 1
    for i in range(4):
    if b == 1:
        print(a*" "+b*"*"+a*" ")
    elif b == 3:
        print(a*" "+b*"*"+a*" ")
    elif b == 5:
        print(a*" "+b*"*"+a*" ")
    elif b == 7:
        print(a*" "+b*"*"+a*" ")
    a = a - 1
    b = b + 2
    for j in range(4):
    a += 1
    b -= 2
    if b == 5:
        print(a*" "+b*"*"+a*" ")
    elif b == 3:
        print(a*" "+b*"*"+a*" ")
    elif b == 1:
        print(a*" "+b*"*"+a*" ")

    (2)第二次實現:

    n = 7
    for i in range(1,n+1,2):
    a = int((n - i)/2)
    print(a*" "+i*"*"+a*" ")
    for i in range(5,0,-2):
    a = int((n - i)/2)
    print(a*" "+i*"*"+a*" ")

    (3)第三次實現:對稱性

    n = int(input(">>>"))
    for i in range(-n//2,n//2+1):
    if i <= 0:
        print(-(i)*" "+"*"*(n+i*2) )
    else:
        print(i*" "+"*"*(n-i*2))

    可以寫成三元運算符:

    n = int(input(">>>"))
    for i in range(-n//2,n//2+1):
    print(-(i)*" "+"*"*(n+i*2)) if i <= 0 else print(i*" "+"*"*(n-i*2))

    (4)第四次實現:abs()取絕對值

    n = int(input(">>>"))
    for i in range(-n//2,n//2+1):
    print(abs(i)*" "+"*"*(n-2*abs(i)))

    (5)第五次實現:

    n =int(input(">>>"))
    a = n//2+1
    for i in range(n):
    i += 1
    if i<a:
        x = a - i
    else:
        x = i - a
    y = n - x*2
    print(" "*x+"*"*y)

    (6)第六次實現:考慮偶數打印的問題

    num = int(input(">>>"))
    if not num%2:
    num += 1
    b = num // 2
    for i in range(-b,b+1):
    print(" "*abs(i)+"*"*(num-2*abs(i)))

    (7)第七種實現:考慮偶數的問題

    while True:
    num = int(input("Please enter an odd number,Otherwise re-enter!"))
    if num % 2 !=0:
        break
    for i in range(-num//2,num//2+1):
    print(" "*abs(i)+"*"*(num-2*abs(i)))

    7、打印九九乘法表

    (1)第一次實現:

    for i in range(1,10):
    for j in range(1,i+1):
        print(j,"x",i,"=",i*j,"\t",end="")
    print()

    (2)第二次實現:

    for i in range(1,10):
    for j in range(1,i+1):
            print("{}*{}={}\t".format(j,i,i*j),end="")
    print()

    (3)第三次實現:

    b = 1
    while b:
    for i in range(1,b+1):
        print("{}*{}={}\t".format(i,b,i*b),end="")
    print()
    b += 1
    if b == 10:
        break

    (4)第四次實現:將每一行的空格數合成一樣的

    for i in range(1,10):
    for j in range(1,i+1):
        if j>1 and j*i < 10:
            print("{}*{}={}".format(j,i,i*j),end="     ")
        else:
            print("{}*{}={}".format(j,i,i*j),end="    ")
    print()

    8、求10萬內的所有素數

    (1)第一次實現:效率及其之差

    import datetime
    start = datetime.datetime.now()
    count = 0
    for i in range(2,100001):
    for j in range(2,i):
        if i!=j:
            if i%j == 0:
                break
    else:
        #print(i,"\t",end="")
        count += 1
    end = (datetime.datetime.now()-start).total_seconds()
    print(end)
    print(count)

    時間:139.644859
    (2)第二次實現:

    import datetime
    start = datetime.datetime.now()
    count = 0
    for i in range(2,100001):
    for j in range(2,int((i**0.5)+1)):
            if i%j == 0:
                break
    else:
        #print(i,"\t",end="")
        count += 1
    end = (datetime.datetime.now()-start).total_seconds()
    print(end)
    print(count)

    時間:0.552862``
    (3)第三次實現:

    import datetime
    start = datetime.datetime.now()
    count = 1
    #print(2,"\t",end="")
    for i in range(3,100001,2):
    for j in range(2,int((i**0.5)+1)):
            if i%j == 0:
                break
    else:
        #print(i,"\t",end="")
        count += 1
    end = (datetime.datetime.now()-start).total_seconds()
    print(end)
    print(count)

    時間:0.490323
    (4)第四次實現:

    import datetime
    start = datetime.datetime.now()
    count = 1
    #print(2,end="\t")
    for i in range(3,100001,2):
    if i > 10 and i % 10 == 5:# 在所有大於10的質數中,個位數只有1,3,7,9
        continue
    for j in range(3,int(i**0.5+1),2):
        if i % j == 0:
            break
    else:
        count += 1
        #print(i,end="\t")
    end = (datetime.datetime.now() - start).total_seconds()
    print(end)
    print(count)

    時間:0.285051
    (5)第五次實現:考慮到與6相鄰的性質

    import datetime
    start = datetime.datetime.now()
    num = 100000
    count = 2 # 2和3這兩個質數先算進去
    for i in range(5,num,2):
    if i%6 != 1 and i%6 != 5:
        continue
    for j in range(5,int(i**0.5)+1,2):
        if i % j == 0:
            break
    else:
        count += 1
        #print(i)
    end = (datetime.datetime.now()-start).total_seconds()
    print(end)
    print(count)

    時間:0.283728

    9、 輸入n個數,求每次輸入後的算術平均數

    (1)第一次實現:

    i = 0
    sum = 0
    while True:
    num = int(input("please input a number:"))
    sum +=  num
    i += 1
    a = input("continue?(Y/N)")
    if a == "N":
        average = sum / i
        print(average)
        break

    (2)第二次實現:

    count = 0
    sum = 0
    while True:
    num = int(input(">>>"))
    if not num:
        break
    sum += num
    count += 1
    print(sum/count)

    (3)第三次實現:

    sum = 0
    count = 0
    while True:
    num = input("please input a number,quit enter!")
    if num == "":
        break
    else:
        sum += int(num)
        count += 1
        print(sum/count)

    10、打印閃電

    (1) 第一次實現:

    b = 3
    for i in range(1,4):
    print(b*" "+i*"*")
    b -= 1
    print(7*"*")
    for i in range(3,0,-1):
    print(3*" "+i*"*")

    (2)第二次實現:

    n = int(input(">>>"))
    a = n // 2
    for i in range(-a,a+1):
    if i < 0:
        print(-i*" "+"*"*(n-a+i))
    elif i == 0:
        print(n*"*")
    else:
        print(a*" "+"*"*(n-a-i))

    (3)第三次實現:

    n = int(input(">>>")) 
    a = n // 2
    for i in range(-a,a+1):
    if i < 0:
        print(" "*abs(i)+"*"*((a+1)+i))
    elif i > 0:
        print(" "*a+"*"*((a+1)-i))
    else:
        print(n*"*")

    (4)第四次實現:

    num = int(input(">>>"))
    n = num // 2
    for i in range(n,-(n+1),-1):
    if i > 0:
        a = i
    else:
        a = n
    if i == 0:
        print(num*"*")
    else:
        print(" "*a+"*"*((n+1)-abs(i)))

    11、猴子吃桃問題

    猴子吃桃問題.猴子第一天摘下若幹個桃子,當即吃了一半,還不過癮,又多吃了一個.第二天早上又將剩下的桃子吃掉一半,又多吃了一個.以後每天早上都吃了前一天剩下的一半零一個.到第十天早上在想吃時,就只剩一個桃子了.求第一天共摘了多少個桃子?

    n = 1
    for i in range(1,10):
    n = 2*(n+1)
    print(n)

    12、給一不超過5位的數,判斷其有幾位

    (1) 第一次實現:

    a=int(input(">>>"))
    if a<0:
    print("輸入格式不正確,請輸入一個不超過5位的數")
    elif a<100000:
    if a<10:
        num
    elif a<100:
        print("是一個2位數")
    elif a<1000:
        print("是一個3位數")
    elif a<10000:
        print("是一個4位數")
    else:
        print("是一個5位數")
    else:
    print("請輸入一個不超過5位的數")

    (2)優化實現1:

    num = int(input(">>>"))
    count = 0
    while True:
    num = num // 10
    count += 1
    if num == 0:
        break
    print(count)

    (3)優化實現2:折半查找

    num = int(input("Please enter a number to judge:"))
    if num >= 1000:
    if num >= 10000:
        print("five digits")
    else:
        print("four digits")
    else:
    if num >= 100:
        print("three digits")
    elif num >= 10:
        print("two digits")
    elif num >= 0:
        print("one digit")
    else:
        print("The negative number does not support judgment for a while. Please try again:")

    13、將10以內的數倒序打印

    (1)第一次實現:

    for i in range(10,0,-1):
    print(i)

    14、打印10以內的偶數

    (1)第一次實現:

    for i in range(10):
    if i % 2 != 0:
        continue
    print(i)

    (2)優化實現1:

    for i in range(10):
    if i % 2 == 0:
        print(i)

    (3)優化實現2:

    for i in range(2,10,2):
    print(i)

    15、倒序打印10以內的偶數

    for i in range(10,0,-2):
    print(i)

    16、給定一個5位數,判斷其有幾位,並從萬位依次打印到個位

    (1)第一次實現:

    num = 54321
    digits = 10000
    count = 0
    for i in  range(5):
    print(num // digits)
    num = num % digits
    digits = digits // 10
    count += 1
    print(count)

    (2)優化實現

    num = int(input(">>>"))
    if num > 100000:
    print("請輸入一個5位以內的數!")
    elif num >=1000:
    if num >=10000:
        val = 5
    else:
        val = 4
    elif num > 0:
    if num >=100:
        val = 3
    elif num > 10:
        val = 2
    else:
        val = 1
    else:
    print("請不要輸入負數!")
    print(val)
    for i in range(val,0,-1):
    print(num // 10**(i-1))
    num = num % (10**(i-1))

    17、給定一個半徑,求圓的周長和面積

    (1)第一次實現:

    r = int(input(">>"))
    p = 3.14
    s = p * (r ** 2)
    print(s)
    c = 2 * p * r
    print(c)

    (2)優化實現:

    r = int(input(">>>"))
    print("s = " + str(3.14 * r * r))
    print("c = " + str(2 * 3.14 * r))

    18、輸入兩個數,升序打印

    (1)第一次實現:

    num1 = int(input())
    num2 = int(input())
    if num1 > num2:
    print(num1,num2)
    else:
    print(num2,num1)

    在python中沒有三目運算符,但是提供了三元表達式:
    真值 if條件 else 假值
    (2)優化實現:

    num1 = int(input())
    num2 = int(input())
    print(num1,num2) if num1 > num2 else print(num2,num1)

    19、輸入若幹個整數,打印出最大值

    (1)第一次實現:

    newNum = 0
    while True:
    num = int(input(">>>"))
    if num > newNum:
        newNum = num
    prompt = input("continue?(Y/N)")
    if prompt == "N":
        break
    print(newNum)

    (2)第二次實現:

    num1 = int(input("please input first number:"))
    n = int(input("You want to compare it several times."))
    for i in range(n):
    num2 = int(input("please input second number:"))
    if num2 > num1:
        num1 = num2 #將第一次比較後大的值給num1,依次輸入,每次num1中存放的都是最大的值
    print("max number is {}".format(num1))

    (3)第三次實現:

    x = int(input(">>>"))
    z = 0
    for i in range(x):
    y = int(input(">>>"))
    if not z: #第一次非0進入語句進行執行,將y的值賦值給z,這時z的值就不在是0,第二次進入非真為0,if第一個判斷就不在執行,進行else的判斷,將最大值放到z中。
        z = y
    elif y > z:
        z = y
    print(z)

    (4)第四次實現:

    num1 = int(input("please input first number:"))
    max = 0
    while True:
    num2 = input("please input second number,exit press enter!")
    if num2:
        num2 = int(num2)
        if max < num2:
            max = num2
    else:
        break
    print("max is",max)

    20、求100以內所有奇數的和

    sum = 0
    for i in range(1,101,2):
    sum += i
    print("add =",sum)

    21、打印右對齊的九九乘法表

    (1)第一次實現:

    for i in range(1,10):
    print(" "*7*(i-1),end="")
    for j in range(i,10):
        flog = i*j
        if flog < 10:
            end = "  "
        else:
            end = " "
        print(str(j) + "*" + str(i) + "=" + str(j*i),end = end)
    print()

    (2)第二次實現:

    for i in range(1,10):
    s = ""
    for j in range(i,10):
        s += "{}x{}={:<3} ".format(i,j,i*j)
    print("{:>78}".format(s))

    (3)第三次實現:將前三列的空格數和後面的保持一致

    for i in range(1,10):
    s = ""
    for j in range(i,10):
        if j <= 3:
            s += "{}x{}={:<2} ".format(i,j,i*j)
        else:
            s += "{}x{}={:<3} ".format(i,j,i*j)  # c風格:‘%d*%d=%2d ‘%(i,j,i*j)
    print("{:>80}".format(s))

    (4)第四次實現:也可以將三元表達式放在format函數中

    for i in range(1,10):
    s = ""
    for j in range(i,10):
        s += "{}x{}={:<{}} ".format(i,j,i*j,2 if j<=3 else 3)
    print("{:>80}".format(s))

    22、打印對頂三角形

    n = int(input(">>>"))
    n = n // 2
    for i in range(-n,n+1):
    print(" "*(n-abs(i))+"*"*(abs(i)*2+1))

判斷和循環