练习1:
"""
需求:输入两个数值:
求两个数的最大公约数和最小公倍数.
最小公倍数=(num1*num2)/最大公约数
缺点:可读性比较差!
"""
#分析:考虑考虑时间和空间(存储)性能问题
#思路:找出最大值(max)和最小数值(min),在[min,1]看是都能整除则是最大公约数
#思路:最大公倍数=(num1*num2)/最大公约数
#(1)接受外界的两个输入
num1 = int(input('Num1:'))
num2 = int(input('Num2:'))
#(2)内置函数进行大小比较,找出最小的!
mini=min(num1,num2)
#(3)求最大公约数-->全局变量-->下方都要用!
great_div=1
#由于这里定义了最大公约数是1的情形,所以可以将range中的mini+1换成mini-->省略判断1的情形
for i in range(1,mini):
#说明:从大到小迭代-->以变量的形式保存-->不用多次计算!
iterator= mini+1-i
if num1 % iterator == 0 and num2 % iterator == 0:
#直接是最大公约数-->直接退出循环即可
great_div = iterator
break
#输出最大公约数
print('%d和%d的最大公约数是:%d' %(num1,num2,great_div))
#(4)求最小公倍数
print('%d和%d的最小公倍数是:%d' %(num1,num2,num1* num2/great_div))
#考虑代码的可读性、以及空间和时间的效率!
练习2:
"""
需求:打印如下-->后续可以打印四种形式的三角形!
*
* *
* * *
* * * *
* * * * *
"""
i=1
while i<=5:
for j in range(1,i+1):
print('*',end='')
print('')
i +=1
练习3:
"""
*****
****
***
**
*
#思路:几行几列--->打印空格空格的逻辑关系!
#核心:换行!--->什么时候换行,什么时候不换行!
"""
Num=int(input('Num:'))
i=0
#行数
while i<=Num-1:
#列数-->每一列的内容
for j in range(Num):
#判断-->先打印空格,再打印*
if j <i:
print(' ',end='')
else:
print('*',end='')
#一行内容打印之后换行-->j确定,for循环执行完毕!
i +=1
print('')
说明:核心是要掌握分析的思路和掌握语言的表现方式!
练习4:
"""
*
* * *
* * * * *
* * * * * * *
需求:正金子塔--->后续(倒金字塔)、正方向(斜)-->四个三角形拼接!
"""
#(1)接受用户的输入
Num=int(input('Num:'))
#(2)while初始化
i=1
while i <=Num:
#列:打印空格!
for j in range(Num-i):
print(' ',end='')
#列:打印*!-->在上面的基础上-->一列上!
for j in range(1,2*i):
print('*',end='')
#一行打印之后,进行换行
print('')
i +=1
需求5:
"""
需求:9*9的乘法表-->注意小细节(换行、制表符)
"""
row=1
#(1)打印的行数
while row<=9:
col=1
#(2)打印的列数
while col<=row:
print('%d*%d=%d\t' %(row,col,row*col),end='')
col +=1
print('')
row +=1
需求6:回文数(字符串)的判断--->借助工具
"""
需求:判断一个数是不是回文数?
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数
说明:这里有点取巧-->判断是字符串!
"""
#将数字转化为字符串比较
Str1=input('Num1:')
#倒序
Str2=Str1[::-1]
if Str1 == Str2:
print('%s是回文数' %(Str1))
else:
print('%s不是回文数' %(Str1)
需求7:回文数的判断--->不借助工具
"""
需求:判断一个整数是不是回文数--->区别于整数
思路:取各个位数--->然后相乘得到结果!
## 示例:
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。
因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数
"""
#(1)模拟接受一个整数
Accept=int(input('Please inut an interget:'))
#(2)定义两个变量
#说明1:Before表示对原始数据进行处理后,下次迭代的原始数据
Before=Accept
#说明2:After表示反转之后的数字(临时)---->多次反转!
#1234321 --> 1 -->12 -->123 --> 1234 --> 12343 -->...
After=0
#(3)反转的过程-->结束的条件
while Before >0:
#第一次反转之后的数字-->一步一步接近反转的数字!
After = After * 10 + (Before % 10)
#下一次反转的原始数据
Before=Before // 10
#(4)条件结束判断是不是回文数
if After == Accept:
print('%d是回文数' %(Accept))
else:
print('%d不是回文数' %(Accet))
"""
思路分析:
1)原始数字除以10所得的余数-->获取各个位置的数字-->乘以10
2)原始数字整除10获得
-->一步一步反转!
"""
说明:核心是掌握算法的逻辑!
需求8:
"""
说明:判断一个变量名合不合法,直到给出一个合法的变量名结束!
理解变量的定义!
"""
while True:
s=input('Please input something:')
if s == 'exit':
break
#exit()
#判断首字母是不是字母或者下划线开头
elif s[0].isalpha() or s[0] == '_':
#接着判断其它字符是不是符合要求
for i in s[1:]:
if not(i.isalnum() or i == '_'):
print('%s变量名不合法' %(s))
break
#说明:只要有一个字符不合法就跳出!
else:
print('%s变量名合法' %(s))
#如果不是的则直接输出-->进行下次循环直到合法!
else:
print('%s变量名不合法' %(s))
需求9:
"""
- 题目描述:
> 给定一个句子(只包含字母和空格), 将句子中的单词位置反转,
单词用空格分割, 单词之间只有一个空格,前>后没有空格。
比如: (1) “hello xiao mi”-> “mi xiao hello”
- 输入描述:
> 输入数据有多组,每组占一行,包含一个句子(句子长度小于1000个字符)
- 输出描述:
> 对于每个测试示例,要求输出句子中单词反转后形成的句子
- 示例1:
```
- 输入
hello xiao mi
- 输出
mi xiao hello
说明:核心是对题目的理解--->数据有多组,每组占一行-->可能会产生分歧!
"""
# join split
# 说明:split没有指定默认是空格--->列表反转-->以空格连接成字符串!
print(' '.join(input().split()[::-1]))
需求10:参上
s = """
hello xiao mi
hello hua wei
hello liu shi shi
"""
#说明-->我的理解!
# 先换行\n
# 再空格
str = s.split('\n')
#测试:print(str)
for i in str[1:]:
spl=i.split(' ')
inv=spl[::-1]
print(' '.join(inv))
#print(inv[::-1])
需求11:
"""
2. 小学生算术能力测试系统:
设计一个程序,用来实现帮助小学生进行百以内的算术练习,
它具有以下功能:提供10道加、减、乘或除四种基本算术运算的题目;
练习者根据显示的题目输入自己的答案,
程序自动判断输入的答案是否正确并显示出相应的信息。
"""
# 说明:负数也是整数
import random
# while--->10次
# 初始化
i = 1
while i <= 10:
# 符号集合
op = ['+', '-', '*', '/']
# 生成随机符号和随机数字
char = random.choice(op)
num1 = random.randint(0, 100)
num2 = random.randint(0, 100)
# (1)除数不能为0-->特殊
if char == '/':
while num2 == 0:
num2 = random.randint(0, 10)
# (2)假设学过负数-->
# 题目
print('%d%s%d =' % (num1, char, num2), end='')
# 学生的输入结果
studnet = int(input())
# 核心-->怎么将运算字符映射成运算符号!
if char == op[0]:
# 加法
if num1 + num2 == studnet:
print('成功,继续哟!')
else:
print('失败,再接再砺!')
elif char == op[1]:
# 减法
if num1 - num2 == studnet:
print('成功,继续哟!')
else:
print('失败,再接再砺!')
elif char == op[2]:
# 乘法
if num1 * num2 == studnet:
print('成功,继续哟!')
else:
print('失败,再接再砺!')
else:
# 除法-->细节(保留的小数位)-->3.*的特性(除不尽则保留(8位),能除尽则除尽)!
# 提示--->除不尽则保留8位小数!
if num1 / num2 == studnet:
print('成功,继续哟!')
else:
print('失败,再接再砺!')
i += 1
需求12:
"""
题目:输入某年某月某日(yyyy-MM-dd),判断这一天是这一年的第几天?
思路1--->三个列表(分别是31天的30天的,以及二月份的)
核心:拆解年月日!
判断在不在列表中!-->进行叠加!
思路2--->比较简单将"每个月份[index]"对应的天数[value]写到列表中!
"""
#(1)获取内容
cal = input('Please input date following the format: yyyy-MM-dd:')
#列表内容-->年、月、日
#(2)进行分割
date = cal.split('-')
#(3)获取各个部分的内容-->拆解!
year = int(date[0])
#特别说明-->09会转变成9
month = int(date[1])
day = int(date[2])
#(4)自定义列表-->天数和月份的映射
#提示-->0的技巧
arr = [0,31,28,31,30,31,30,31,31,30,31,30,31]
#全局变量-->天数
total = 0
#(5)判断是不是闰年
if (year % 4 == 0 and year % 100 !=0) or (year % 400 == 0):
#细节:改变列表的元素
arr[2]=29
for i in range(1,len(arr)):
#说明:i刚好表示对应月份(索引)-->映射为天数!
if month > i:
total += arr[i]
else:
#表示想等,此时直接加上天数即可!
total +=day
#如果不及时退出-->则会12*12-->会再次循环!
break
print('天数',total)