Python基本练习(二)

1. 打印9*9乘法表

#打印9*9乘法表
for i in range(1,10):
    for k in range(1,i+1):
        print(f"{k} * {i} = {i*k}",sep="" ,end="\t")
    print();

2. 打印菱形

Python基本练习(二)
思路一:建立坐标系,根据数学坐标系判断菱形取值范围。打印

#打印菱形,第一总思路,数学公式判断边界
border = int(input("请输入菱形边长:"))
for y in range(border-1,-border,-1):
    for x in range(-border,border):
        if  y < x + border and y> x-border and y<-x+border and y> -x- border:
            print("*",sep="",end="")
        else:
              print(" ",sep="",end="")
    print();

思路二:上下对称打印

border = int(input("请输入菱形边长:"))
up = "";
down = "";
for i in range(1,border):
    starr = " "*(border-i) +"*"*i +"*"*(i-1)+" "*(i-1)
    up += starr +"\n"
    down = "\n" + starr  + down
end = "*"*(border+border-1)
print(up+end+down,end="")   

3. 求斐波拉契数列第101项

#求斐波拉契数列第101项
n = 101
num1 = 1
num2 = 1
for i in range(3,n+1):
   num1 , num2 = num2 , num1 + num2
print(num2);
#公式
#fn = ((5**0.5)/5)*(((1+5**0.5)/2)**n-((1-5**0.5)/2)**n)
#print(int(fn));

4. 求10万以内的所有素数

#求10万以内所有素数
#比6大的素数一定是6的倍数少1或者加1,一个素数不能被比他小的素数整除,开方判断整除范围
import time
log = time.time()
n = 1000000
primeArr = [3]
for i in range(6,n+1,6):
    for h in [i-1,i+1]:
        booll = True
        hh = h**0.5+1
        for k in primeArr:
            if k>hh:
                break
            if not h%k :
                booll = False
                break
        if booll:
            primeArr.append(h)
#print([1]+primeArr);
log2 = time.time()-log
print(len(primeArr)+1,log2)

素数优化解法二:

#求100万以内所有素数
#比6大的素数一定是6的倍数少1或者加1
import time
log = time.time()
n = 100000
index = 10000
index2 = 1
primeArr = [3]+[0]*index
for i in range(6,n+1,6):
    for h in [i-1,i+1]:
        booll = True
        hh = h**0.5
        for k in primeArr:
            if k>hh:
                break
            if not h%k :
                booll = False
                break
        if booll:
            primeArr[index2] = h
            index2 += 1
            if len(primeArr) == index2:
                primeArr.extend([None]*index)
#print([2]+primeArr[:len(primeArr)-index2]);
#print([2]+primeArr);
log2 = time.time()-log
print("{}以内的素数个数为:{}。\t用时:{}秒".format(n,index2+1,log2))

素数优化解法三:(速度最快)

import datetime
start = datetime.datetime.now()
n = 100000
p = [True] * (n + 1)  #定义素数可能出现的区间。
p[0] = p[1] = False
for i in range(2, int(n**0.5)+1):  #划分乘积因子的取值范围 即:i*i的最大值要小于n的0.5次方
    if not p[i]:  #排除已经是乘积因子求出的数
        continue
    for j in range(i * i, n + 1, i):  #标记是乘积因子的的数,如2*2  2*3  2*4 。。。 3*3  3*4  3*4  发现全部排除
        p[j] = False    
primes = [i for i in range(n + 1) if p[i]] #取出上面集合中没有被排除的数,因为已经计算出所有乘积的结果,所有剩下的数,一定没有乘积。即为素数)
print(primes)
end = datetime.datetime.now()
print((end - start).total_seconds())

5. 打印杨辉三角前6行

Python基本练习(二)

#计算杨辉三角前6行
n = 6
arr = [None]*(n+1)
for i in range(1,len(arr)):
    arr[i] = [1]+[None]*(i-1)+[1]
arr[0] = [1]
for i in range(2,len(arr)):
    for k in range(1,len(arr[i])-1):
        arr[i][k]=arr[i-1][k-1]+arr[i-1][k]
print(arr);

6. 用户输入一个十进制正整数数字

  1. 判断是几位数
  2. 打印每一位数字及其重复的次数
  3. 依次打印每一位数字、顺序个、十、百、千、万…位
#第一题:用户输入一个十进制正整数数字
#1.判断是几位数
#2.打印每一位数字及其重复的次数
#3.依次打印每一位数字、顺序个、十、百、千、万...位
booll = False
num = None
while not booll:
    num = input("请输入一个正整数数:")
    booll =  num.isdigit()
    if not booll : 
        print("输入有误!")
    else:
        num = num.strip().lstrip("0")
print("{}是个{}位数".format(num,len(num)))
count = [0]*10 #记录每位数字出现的次数
for i in num: #记录没位数出现的次数
    count[int(i)] += 1
for i in range(len(num)):
    print("第{}位数是:{}\t出现的次数是{}".format(i+1,num[-i-1],count[int(num[-i-1])]))

7.判断数字位数并排序打印

输入5个十进制正整数数字,打印每个数字的位数,将这些数字排序打印,要求升序打印

#第二题:判断数字位数并排序打印
#输入5个十进制正整数数字,打印每个数字的位数,将这些数字排序打印,要求升序打印
arr = []
n = 5
while n>=1:
    num = input("请输入一个正整数:").strip().lstrip("0")
    if num.isdigit():
        arr.append(int(num))
        n -= 1
    else:
        print("输入有误,请重新输入!")
#arr = [23,2345,23,1,45]
def quickSort(arr,low,hght):
    if low>=hght: return
    left = low
    right = hght
    key = arr[left]
    while left<right:
        while left<right and arr[right]>=key : right -= 1 
        arr[left] = arr[right]
        while left<right and arr[left]<key : left += 1 
        arr[right] = arr[left]
    arr[left] = key
    quickSort(arr,low,left-1)
    quickSort(arr,left+1,hght)
quickSort(arr,0,len(arr)-1)
for i in arr:
    print("{}是个{}位数".format(i,len(str(i))))