11.题目:给定一个数,判断其 是否为素数。
程序分析:首先知道什么是素数?素数就是只能被1和它本身所整除的数。用常规思维,如果给定一个数是5,怎么判断呢?那就是判断range(2,5)这些数是否都能被5整除,如果还不懂,就要百度咯~~
方法一:用循环
# -*- coding: UTF-8 -*-
#判断素数
while True:
x = input("请输入一个正整数:")
i = 2 #除数当然要从 2 开始咯
if x == 1: #先判断一下你输入的是不是 1
print "%d 不是素数也不是合数,请重新输入"%(x)
elif x == 2: # 2 当然也不用循环了
print "%d 是素数"%(x)
else: #大于 2 的情况
while i < x:
if x % i == 0:
print "%d 不是素数"%(x)
break
i += 1
if i == x:
print "%d 是素数"%(x)
输出:
请输入一个正整数:53
53 是素数
请输入一个正整数:63
63 不是素数
请输入一个正整数:75
75 不是素数
请输入一个正整数:
方法二:定义函数的方法
# -*- coding: UTF-8 -*-
def isPrime(n): # 如果是素数,返回True,不是素数返回False
if n <= 1:
return False
i = 2
while i*i <= n: # 这里为了优化算法,故判断 i * i <= n
if n % i == 0:
return False
i += 1
return True
print isPrime(9)
print isPrime(23)
输出:False
True
12.题目:判断1~100之间有多少个素数,并输出所有素数。
程序分析:上面已经知道了如何判断一个素数,这里就要练习了,找出素数并输出。只需要外面加一个循环就可以了。哈哈
方法一:在上题”方法一”源程序上直接改
# -*- coding: UTF-8 -*-
x = range(2,101)
n = 0
for j in x:
i = 2 #除数从 2 开始,没问题吧?嘿嘿
while i < j:
if j % i == 0:
break
i = i + 1
if i == j:
n = n + 1
print j
print "总共 %d 个素数" % (n)
输出:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
总共 25 个素数
方法二:用两个数列去做,其实就是把方法一的 i = i + 1 改成range(2,j-1),这样更容易些,不过都是大同小异,主要是理解思路。
思路明白了,代码如下!
# -*- coding: UTF-8 -*-
n = 0
for j in range(2,101):
fg = 0
#为什么是 j - 1 呢?看下面的思路图就明白了,当然如果要求更优化的算法,也可换成 j / 2
for i in range(2,j-1):
if j % i == 0:
fg = 1
break
if fg == 0:
n = n + 1
print j
print "总共 %d 个素数" % (n)
方法三:定义函数的方法
# -*- coding: UTF-8 -*-
def is_prime(n):
if n == 1:
return False
for i in range(2, n//2 + 1):
if n % i == 0:
return False
return True
print(filter(is_prime, range(1, 101)))
备注:我写的这几种方法都比较通俗易懂,网上有很多用函数做的,刚开始我是看不懂的,所以我只用循环去做,这种方法对于初学者来说很有帮助,先打好基础为好,不要急。本人就是因为太着急,没打好基础就学后面的东西,导致什么都不会,所以不要急,慢慢来~~~,函数的方法可以看看,后面学到再讲。
13.题目:打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
# -*- coding: UTF-8 -*-
for i in range(100,1000):
x = i / 100
y = i % 100 / 10
z = i % 10
if i == (x ** 3) + (y ** 3) + (z ** 3):
print i
输出:153
370
371
407
14.题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
程序分析:这题就比较简单了,直接用判断语句 if 就可以了。
# -*- coding: UTF-8 -*-
while True:
score = int(raw_input("请输入你的成绩:"))
if score >= 90:
print "你的成绩是 A"
elif score >= 60:
print "你的成绩是 B"
else:
print "你的成绩是 C"
15.题目:输出指定格式的日期。
程序分析:使用 datetime 模块。
# -*- coding: UTF-8 -*-
import datetime
if __name__ == '__main__':
# 输出今日日期,格式为 dd/mm/yyyy。更多选项可以查看 strftime() 方法
print(datetime.date.today().strftime('%d/%m/%Y'))
备注:模块的内容暂时没有学到,到时候会整理相关文章,这个例子有兴趣的可以看一下,主要是常用,所以这里列出来了。看不懂没关系,模块后面在学,这题不会可以跳过了,哈哈!
16.题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析:此题有两种方法,都用到了 while,具体看代码。
方法一:这种方法比较麻烦,建议后面再看,就是将数字和字母都列出来,利用 for 循环遍历。
# -*- coding: UTF-8 -*-
alpha = range(ord('A'),ord('Z')+1)
alpha.extend(range(ord('a'),ord('z')+1)) #前两行是定义alpha
all_alpha = [chr(v) for v in alpha]
digit_ord = range(ord('0'),ord('9')+1)
all_digit = [chr(v) for v in digit_ord]
x = raw_input("pls input a string:")
digit_num = 0
alpha_num = 0
other_num = 0
for v in x:
if v in all_alpha:
alpha_num += 1
elif v in all_digit:
digit_num += 1
else:
other_num += 1
print "字母=%d,数字=%d,其他 =%d"%(alpha_num,digit_num,other_num)
方法二:用使用类型统计函数的方法
# -*- coding: UTF-8 -*-
x = raw_input("pls input a string:")
intcount = 0
strcount = 0
othercount = 0
space = 0
for i in x:
if i.isdigit(): #这个函数是用来判断数字类型的
intcount += 1
elif i.isalpha(): #用来判断字母类型
strcount += 1
elif i.isspace(): #用来判断空格
space += 1
else:
othercount += 1 #其他字符类型
print "数字 = %d,字母=%d,空格 = %d,其他 = %d" %(intcount,strcount,space,othercount)
17.题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
程序分析:用数学的角度去考虑的时候,是不是觉得很简单?设每次的高度为 h,经过的长度为 s,那么
初始高度(长度) s = 100
第一次下落后弹起的高度 h = s / 2
经过的总长度 s = 100 + 2 * 50 + 2 * 25 + 2 * 12.5....
源代码:
# -*- coding: UTF-8 -*-
s = 100.0
h = s / 2
for i in range(1,11): #题目要求第十次的高度和总长度,所以要循环10次
s = s + h * 2
h = h / 2
print "总路程= %f,第十次反弹的高度=%f"%(s,h)
18.题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。这个比较简单,只要静下心来理解,就非常容易了。
设一共有y个桃,根据题目可得,
第一天 day1 = x / 2 -1
第二天 day2 = day1 / 2 -1
...
以此类推,可以得到猴子吃掉的桃子数和天数的关系表达式为 y = (x + 1) *2
第十天是1个桃,那么回代即可。
源程序:
# -*- coding: UTF-8 -*-
x = 1 #第十天所剩的桃子,也是桃子初始值
for day in range(9,0,-1):
y = (x + 1) * 2
x = y #每次求得的桃子要作为 x 继续计算,因为是逆向思维哦!
print x
19.题目:打印出如下图案(菱形):
*
***
*****
*******
*****
***
*
程序分析:有三种方式哦,墙两种比较简单,直接用 print 就好啦!
方法一:最笨最简单的方法
# -*- coding: UTF-8 -*-
print " *"
print " ***"
print " *****"
print "*******"
print " *****"
print " ***"
print " *"
方法二:用到了center()函数,就是居中
# -*- coding: UTF-8 -*-
from string import center
print "*".center(7)
print "***".center(7)
print "*****".center(7)
print "*******".center(7)
print "*****".center(7)
print "***".center(7)
print "*".center(7)
方法三:这个~~~首先要学会stdout函数,然后看算法,无非就是计算空格数和 * 数,不算太难哦!看不懂就先不看了。不着急~
# -*- coding: UTF-8 -*-
from sys import stdout
for i in range(4):
for j in range(2 - i + 1):
stdout.write(' ')
for k in range(2 * i + 1):
stdout.write('*')
print #此处的作用是换行,下同
for i in range(3):
for j in range(i + 1):
stdout.write(' ')
for k in range(4 - 2 * i + 1):
stdout.write('*')
print
20.题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
程序分析:学会分解出每一位数。
# -*- coding: UTF-8 -*-
x = int(raw_input("请输入一个数:\n"))
a = x / 10000
b = x % 10000 / 1000
c = x % 1000 / 100
d = x % 100 / 10
e = x % 10
if a != 0:
print "5 位数:",e,d,c,b,a
elif b != 0:
print "4 位数:",e,d,c,b,
elif c != 0:
print "3 位数:",e,d,c
elif d != 0:
print "2 位数:",e,d
else:
print "1 位数:",e