例1:题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
方法1:三层for
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if i!=j and i!=k and j!=k:
print(i,j,k)
1 2 3
1 2 4
1 3 2
1 3 4
1 4 2
1 4 3
.......(略)
以下集合网友的方法,学习下 方法2:
from itertools import permutations
for i in permutations([1, 2, 3, 4], 3):
print(i)
(1, 2, 3)
(1, 2, 4)
(1, 3, 2)
(1, 3, 4)
(1, 4, 2)
......(略)
简单整理了permutations函数和combinations函数 permutations函数重在排列 combinations函数重在组合(均是不重复) python 3.x 中函数返回的是iterators,无法像python2.x 直接返回一个list,故需要再加上一个list()将iterators转化为一个list),像这类函数还有map()
import itertools
s=[1,2,3]
list1=list(itertools.combinations(s,3))
print(list1)
list2=list(itertools.permutations(s,3))
print(list2)
结果
[(1, 2, 3)]
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
方法3
for i in range(123,433):
a = i //100 # 求百位
b = i //10 % 10 # 求百位
c = i % 10 # 求个位
if a != b and a != c and b != c and 0 <a<5 and 0 <b<5 and 0 <b<5:
print(i)
123
124
125
126
....(略)
例2跳过
例3:题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
解析: a 100=i^2 (i和j可以为负数,为负数时,a为同一个) a 168=j^2 168=(j i)*(j-i) 根据上面等式找i,j范围,范围尽可能缩小
方法1:双层for 逆向
# i,j的范围可以为负数,-85<i<85,i/j为负数或正数,对应的a为同一个,所以只取i/j正数范围
for i in range(1, 85):
for j in range(1, 85):
if (j i)*(j-i) == 168:
print(i*i-100)
结果
-99
21
261
1581
方法2: 集合
#X1=N*2-100的合集
x1 = map(lambda i:i**2-100,range(1,85))
#X2=M*2-100-168的合集
x2 = map(lambda i:i**2-100-168,range(1,85))
#两个合集求并集结果
print(set(list(x1)) & set(list(x2)))
结果
{21, 1581, 261, -99}
例4:题目:输入某年某月某日,判断这一天是这一年的第几天?
方法1:
year = int(input('输入年份:'))
month = int(input('输入月份:'))
day = int(input('输入日期:'))
# 闰年的月份
runmonths = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 平年的月份(差别在第二个月份)
pingmonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
runday = sum(runmonths[0:month-1]) day
pingday = sum(pingmonths[0:month-1]) day
if ((year % 4 == 0 and year % 100 != 0) or (year % 400 == 0 and year % 4000 != 0)):
print('这是该年的第%d天' % runday)
else:
print('这是该年的第%d天' % pingday)
结果
输入年份:2019
输入月份:12
输入日期:3
这是该年的第337天
判断闰年还可以导入calendar,并替换if 内的条件语句
import calendar
flag = calendar.isleap(year) # 判断输入的年份是否为闰年
if flag == 1:
.......(下同,略)
方法2: python 自带的日期 python中时间日期格式化符号: %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %M 分钟数(00=59) %S 秒(00-59) %j 年内的一天(001-366)
import time
# 格式化时间
print(time.strptime('2019-12-03', '%Y-%m-%d')[7])
结果
337
方法2扩展
time.localtime() time.struct_time(tm_year=2015, tm_mon=10, tm_mday=30, tm_hour=16, tm_min=25, tm_sec=45, tm_wday=4, tm_yday=303, tm_isdst=0) time.localtime().tm_year 2015
import time
yourtime=input('请输入年份,格式如XXXX-XX-XX:')
# 将时间格式化
d=time.strptime( yourtime,'%Y-%m-%d').tm_yday
print 'the {} day of this year!' .format(d)
例5:题目:输入三个整数x,y,z,请把这三个数由小到大输出。
方法1:sort() / sorted() 注意写法
array.sort(reverse = False) # 默认升序False,可不填写 print(array) # 原数组array本身已改变
newarray = sorted(array,reverse = False) # 默认降序 print(newarray) #变换结果 print(array) #原数组array没有改变
c =['CCC’, 'kb’, 'ffff’, 'bz’] # 输入关键字len进行字符串排序 result = sorted(c,key=len)
numbers = [5,9,1]
numbers.sort(reverse=False)
print(numbers)
[1, 5, 9]
方法2:排序算法 略
例6:题目:斐波那契数列。输出第n个斐波那契数列。(适用于走楼梯的例子)
序号 1 2 3 4 5 6 7 8
数列 1 1 2 3 5 8 13 21
方法1:递归调用
def Fibonacci(n):
if n <= 0:
return None
if n == 1 or n == 2:
return 1 # 函数的出口
else:
return Fibonacci(n-1) Fibonacci(n-2)
result = Fibonacci(8)
print(result)
结果
21
方法2: 在C语言中,下标循环,将每一个当作数组元素 f[i] = f[i-1] f[i-2] f[i] = f[i-1] f[i-1] = f[i-2] 但在该例子中,用以下方式来替换,思路相同
num = int(input('请输入序号'))
if num <= 0:
print('none')
else:
a, b= 1, 1 # 元组类型
for i in range(1,num):
a,b = b,a b # 交换
print(a)
方法3:(好秒的方法)
def Fibonacci(n):
if n <= 0:
return None
elif n == 1 or n==2:
return 1
else:
array = [1, 1]
for i in range(2, n):
array.append(array[-1] array[-2])
return array[n-1]
print(Fibonacci(10))
例7:题目:将一个列表的数据复制到另一个列表中。
方法1:append 对空数组进行尾部追加
a = [1, 2, 3, 4]
b1 = []
length = len(a)
for i in range(length):
b1.append(a[i])
print(b1)
方法2:列表[:] 新数组的改变不会影响到原数组
a = [1, 2, 3, 4]
b5 = a[:]
print(b5)
b5.pop()
print(b5)
print(a) # a没有发生改变
结果
[1, 2, 3, 4]
[1, 2, 3]
[1, 2, 3, 4]
方法3:引用(虽然结果一样,不推荐) 新数组的改变会影响到原数组
a = [1, 2, 3, 4]
b2 = a
b2.pop()
print(b2)
print(a) # 引用,新数组变化,原数组也会变化。
结果
[1, 2, 3]
[1, 2, 3]
方法4:copy
a = [1, 2, 3, 4]
b4 = a.copy()
print(b4)
例8:九九乘法表
for i in range(1, 10):
for j in range(1, i 1):
print('%dx%d=%d' % (j, i, j*i), end=' ')
# 格式化
# print('{}*{}={}'.format(j, i, j * i))
print(' ')
例9:暂停一秒输出
注意输出字典的方式 键值对输出
import time
myD = {1: 'a', 2: 'b'}
for key, value in dict.items(myD):
print key, value
time.sleep(1) # 暂停 1 秒
结果
1 a
2 b
例10:题目:暂停一秒输出。
import time
print(time.strftime('%Y-%m-%d %H-%M-%S', time.localtime(time.time())))
time.sleep(1)
print(time.strftime('%Y-%m-%d %H-%M-%S', time.localtime(time.time())))
or
import time,datetime
time.sleep(1)
TIME = datetime.datetime.now() #获取当前时间
print(TIME.strftime('%Y.%m.%d %H-%M-%S'))
例11:题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
斐波那契数列规律,略
例12:题目:判断101-200之间有多少个素数,并输出所有素数。
方法1:常规 判断条件:if i % j == 0:
class Solution(object):
def Sushu(self):
jishu = 0
for i in range(101, 201):
for j in range(2, i//2): # i//2还可以缩小到i**0.5
if i % j == 0:
break
# if i-1 == j:
# jishu = 1
# print(i)
else:
jishu = 1
print(i)
return jishu
s = Solution()
result = s.Sushu()
print(result)
结果
101 103 107 109 113 127 131 137 139 149 151
157 163 167 173 179 181 191 193 197 199
21
方法2:判断条件:if i % j == 0: 换一种形式,列表
class Solution(object):
def Sushu(self):
mylist = []
for i in range(101, 201):
mylist.append(i) #加入元素
for j in range(2, int(sqrt(i)) 1):
if i % j == 0:
mylist.pop() # 剔除不符合条件的元素
break
return mylist, len(mylist)
结果
([101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199], 21)
例13 水仙花数
求余 求整 分别求出个位/十位/百位
例14 题目:将一个正整数分解质因数。例如:输入90,打印出90=2x3x3x5(间隔符为*)
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def Fenjie(self, num):
# write code here
k = 2
array = []
res = num
while k >= 2 and k < num:
if res % k == 0: # 找出所有连乘的质数,包括重复的
res = res // k
k = k # 考虑到可能下一个还是重复的因子
array.append(str(k)) # 转换成str,为了下面的join方便
else:
k = 1
return '%d=' %num '*'.join(array) # 输出格式
num = int(input('请输入一个正整数'))
s = Solution()
s.Fenjie(num)
print(s.Fenjie(num))
例15 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
方法1:if else(三目) 语法:条件为真时的结果 if 判段的条件 else 条件为假时的结果
score = int(input('输入成绩'))
print('A' if score >= 90 else ('B' if score >= 60 and score < 90 else ' C'))
方法2:and-or连用(相当于三目),完美用一句话替代第三种方法, 格式:xxx and xxx or xxx and xxx or xxx
# 以下两句任意一句都可以
print(score >= 90 and 'A' or (score < 90 and score >= 60) and 'B' or 'C')
print('A' and score > 89 or 'B' and score >= 60 or 'C')
方法3: if -elif-else
score = int(input('输入成绩'))
s = score // 10
if s >= 9:
print('A')
elif 6 <= s and s <= 8:
print('B')
else:
print('C')
例16 题目:输出指定格式的日期
抄了网友的
import time
print time.time() #1498539133.655
print time.localtime() #tm_year=2017, tm_mon=6, tm_mday=27, tm_hour=12, tm_min=53, tm_sec=16, tm_wday=1, tm_yday=178, tm_isdst=0
print time.asctime() #'Tue Jun 27 12:53:50 2017'
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) #'2017-06-27 13:00:57'
import datetime
print datetime.date.today() #datetime.date(2017, 6, 27)
print datetime.date.today().strftime('%d/%m/%Y') #'27/06/2017'
print datetime.date(1941, 1, 5) #datetime.date(1941, 1, 5)
例17 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
中文?暂留疑问 方法1:也适用于c语言
str = input('请输入字符')
length = len(str) #中文占空不是一个字符,len()无法统计
a, b, c, d, e= 0, 0, 0, 0, 0
for i in range(length):
if str[i] <= 'z' and str[i] >= 'a':
a = 1
elif str[i] <= 'Z' and str[i] >= 'A':
b = 1
elif str[i] == ' ':
c = 1
elif str[i] <= '9' and str[i] >= '0':
d = 1
else:
e = 1
print('英文小写:%d, 英文大写:%d, 空格:%d, 数字:%d, 其他字符:%d' % (a, b, c, d, e))
方法2:python 自带的函数
str = input('请输入一个字符串:\n')
for c in str:
if c.isalpha(): #英文
letters = 1
elif c.isspace(): # 空格
space = 1
elif c.isdigit(): # 数字
# c.isnumeric():
digit = 1
else: # 其他
others = 1
方法3:自带函数
import re
str = input('请输入一个字符串:\n')
for i in range(len(str)):
if re.match('\d',str[i]): #数字
digNum =1
elif re.match('[a-zA-Z]',str[i]): #大小写英文字母
charNum =1
elif re.match('\s',str[i]): #空格
spaceNum =1
else:
otherNum =1
例18:题目:求s=a aa aaa aaaa aa…a的值,其中a是一个数字。例如2 22 222 2222 22222(此时共有5个数相加),几个数相加由键盘控制。
关键:如何表示每一个数字
方法1: 将数字转换成字符串
count = input('请输入个数count')
num = input('请输入数字num')
sum = 0
for i in range(1, int(count) 1):
everynum = int(num*i)
sum = everynum
方法2:找数字规律,边找边加 aaa = a x 100 a x 10 a
count = int(input('请输入个数count'))
num = int(input('请输入数字num'))
sum = 0
everynum = 0
if count <= 0:
print(0)
else:
for i in range(1,count 1):
everynum = num * 10 **(i-1)
sum = everynum
print(sum)
方法3: 同2,也是找每个数规律(将每个数集合到一个列表,最后将列表元素加起来)
Tn = 0
Sn = []
n = int(raw_input('n = '))
a = int(raw_input('a = '))
for count in range(n):
Tn = Tn a
a = a * 10
Sn.append(Tn)
print Tn
# 对列表元素的累加
Sn = reduce(lambda x,y : x y,Sn)
print '计算和为:',Sn
例19:目:一个数如果恰好等于它的因子之和,这个数就称为'完数'。例如6=1+2+3.编程找出1000以内的所有完数
import functools import reduce
from sys import stdout
def yinzi(num):
array = []
i = 1
while 0 < i < num:
if num % i == 0:
array.append(i)
i = 1
return array
for i in range(1, 1001):
array = yinzi(i)
# print(array) # 能打印出来,如果不是空列表,代表该数不是素数
if array: # 排除空列表,即没有因子的i,因为该数一定为素数,素数的因子相加绝对不会等于该数本身
sum = reduce(lambda x, y: x y, array)
# yinzisum = sum(array) #列表求和的两种方式
if i == sum :
# print(array, i)
# stdout.write和print差别:前一个实时打印,根本在于一个结束符为\n,自动换行,一个结束符号\r,不会自动换行
stdout.write(str(i))
stdout.write(str(array))
stdout.write(' ')
|