'''
Created on 2020年8月3日
demo1:99乘法表(分析单个算式的规律)
另一种方法是(从整个表的整体分析):将内部循环改为
for j in range(1,10):
if i >= j:
print("{0}x{1}={2}".format(i,j,i*j),end=" ")
def demo1():
for i in range(1,10):
for j in range(1,i+1):
print("{0}x{1}={2}".format(i,j,i*j),end=" ")
print()
demo2:使用循环输出等腰三角形
def demo2(n):
for i in range(0,n):
print("{: ^50}".format("*"*(1+i*2)))
demo3:给定奇数n,输出横竖斜的总和相等
a.如果右上角的位置的行和列都越界,就将这个数放在上个数的正下方(即:上个数的行+1)。
b.如果右上角的位置只有行越界,就将行改到最大,列不变。
c.如果右上角的位置只有列越界,就将列改到最小,行不变。
d.如果右上角的位置没有越界,但是已经填有数字,就将这个数放在上个数的正下方。
def demo3():
n = int(input("请输入一个奇数:"))
#初始化一个矩阵
m=[[0 for i in range(n)] for i in range(n)]
#1总是位于第一行的中间位置
row, col = 0, n//2
sum = n*n
#利用循环往 矩阵里填数
for i in range(1,sum+1):
m[row][col]=i
row -= 1
col += 1
if row < 0 and col >=n:
row, col = row + 2, col - 1
elif row < 0:
row = n-1
elif col >= n:
col = 0
elif m[row][col] != 0:
row, col = row + 2, col - 1
for i in range(n):
for j in range(n):
print("%02d"%m[i][j],end=" ")
print()
demo4:给定一个奇数n,打印菱形
import copy
def demo4():
n = int(input("请输入一个奇数:"))
sum = 1
n1 = n//2
for i in range(0,n1):
print("{: ^50}".format("*"*(1+i*2)))
sum += 2
sum2 = copy.copy(sum)
for i in range(0,n1+1):
print("{: ^50}".format("*"*(sum2-i*2)))
demo5:给定一个奇数n,打印空心菱形
str_replace()#用来替换每行字符中的“*”
def demo5():
n = int(input("请输入一个奇数:"))
sum = 1
n1 = n//2
for i in range(0,n1):
line = "*"*(1+i*2)
if i > 0:
line = str_replace(line," ",1,(i-1)*2+1)
print("{: ^50}".format(line))
sum += 2
sum2 = copy.copy(sum)
for i in range(0,n1+1):
line = "*"*(sum2-i*2)
if i < n1:
line = str_replace(line," ",1,sum2-(i+1)*2)
print("{: ^50}".format(line))
#按索引批量替换字符串
def str_replace(str,char,start,end):
string = list(str)
for i in range(start,end+1):
string[i] = char
return "".join(string)
demo6:输入成绩,打印等级
用元组装等级,然后利用取余对应元组的index
def demo6():
degree = ("A","B","C","D")
while True:
score = int(input("请输入成绩(0-100之间):"))
if score not in range(101):
print("成绩不合法")
return
else:
s = score//10
if s == 10:
s = 9
elif s <= 6:
s = 6
print("成绩是:{0},等级为:{1}".format(score, degree[9-s]))
demo7:判断101~200之间有多少个素数,并输出所有素数
在101~200之间的不是合数的就是质数,我们设立一个flag,如果不是合数就输出
def demo7():
flag = 0
for i in range(101,201):
flag = 0
for j in range(2,int(sqrt(i))+1):
if i%j == 0:
flag = 1
break
if flag == 0:
print(i,end=" ")
demo8:打印所有的“水仙花数”
判断是否为水仙花数(3位数:100~999以内),提取一个3位数的个,十,百位做计算
def demo8():
for i in range(100,1000):
h = i//100
t = (i-h*100)//10
o = i-h*100-t*10
if h**3+t**3+o**3 == i:
print(i,end=" ")
demo9:统计字符串中字母,空格,数字和其他字符的个数
def demo9():
str = input("请输入一个字符串:")
letters = 0
space = 0
digit = 0
other = 0
for char in tuple(str):
if char.isalpha():
letters += 1
elif char.isspace():
space += 1
elif char.isdigit():
digit += 1
else:
other += 1
print("字母数:{0},空格数:{1},数字数:{2},其他字符数:{3}".format(letters,space,digit,other))
demo10:给定半径n,打印近似圆
利用勾股定理
利用字符串格式化,三行代码搞定
demo11:笨办法,将整个过程分为打印:1、圆左边的空格。2、圆左边的点。3、圆中间的空格。4、圆右边的点
def demo10(r):
#记录上一次循环的x,防止出现多行相同的结果,如果相同就不打印,直接跳过
# last_x = 0
for i in range(0,2*r+1,2):
x = round(r-sqrt(r**2 - (r-i)**2))
# if x == last_x :
# continue
# last_x = x
print(("*"+" "*2*(r-x)+"*").center(2*r+2, " "))
def demo11(r):
for i in range(0,2*r+1,2):
x = round(r-sqrt(r**2 - (r-i)**2))
space_len = 2*(r-x)
for j in range(0,x+1):
print(" ",end="")
print("*",end="")
for k in range(0,space_len+1):
print(" ",end="")
print("*")
demo12:打印指定n大小的字母菱形图
------d------
----d-c-d----
--d-c-b-c-d--
d-c-b-a-b-c-d
--d-c-b-c-d--
----d-c-d----
------d------
def demo12(n):
#中间字符串长度
mid_len = 4*n - 3
#行数
row = 2*n-1
#第一行的字母为
fst_char = chr(ord("a")+n-1)
print ("第一行字母:{0}".format(fst_char))
line_list = []
#第二行,算一次;第三行算两次 (直到第n行)
for i in range(1,n+1):
cen_line1 = fst_char
if i > 1:
#计算次数
count = 1
#循环构造每行的中间内容
while count < i:
cen_line1 = cen_line1+("-{0}".format(chr(ord(fst_char)-count)))
count +=1
rev_line = cen_line1[::-1][1:]
cen_line1 = cen_line1 + rev_line
print(cen_line1.center(mid_len,"-"))
if i != n:
line_list.append(cen_line1)
#n+1行以后,将上面的cen_line1存起来再遍历打印
for i in range(len(line_list)):
print(line_list[len(line_list)-i-1].center(mid_len,"-"))
demo13:模拟计算机底层如何实现二进制数相加
利用逻辑门逐位操作,掌握两个关键点:
1、sum -- xor(异或)--和
2、carry -- and(与)--进位
尽量避免使用str+str
import io
def demo13():
d_str = input("请输入两个二进制数(a,b):")
a, b = d_str.split(",")
len_1 = len(a)
len_2 = len(b)
#将位数少的二进制高位补零,这里需要用到可变字符串
io_str1 = io.StringIO("")
if len_1 != len_2:
for i in range(abs(len_1-len_2)):
io_str1.seek(i)
io_str1.write("0")
#print(io_str1.getvalue())
if len_1 > len_2:
b = io_str1.getvalue()+b#不好,又创建了一个对象
#print(b)
elif len_1 < len_2:
a = io_str1.getvalue()+a
result = ""
#进位并打印结果
carry = 0
io_str2 = io.StringIO("")
for i in range(len(a)-1,-1,-1):
#就得先判断是否进位
if carry:#上次进了
io_str2.seek(i)
io_str2.write(str(int(a[i]) ^ int(b[i])^1))
carry = int(a[i]) | int(b[i])
else:#上次没进
io_str2.seek(i)
io_str2.write(str(int(a[i]) ^ int(b[i])))
carry = int(a[i]) & int(b[i])
if not i and carry:#解决如果最后一位进位的话,超出原最长二进制数长度无法打印的问题
result = "1" + io_str2.getvalue()
else:
result = io_str2.getvalue()
print(result)
@author: liyy2023@foxmail.com
'''