警察局抓了a,b,c,d四名偷窃嫌疑犯,其中只有一人是小偷。审问中 a说:“我不是小偷。” b说:“c是小偷。” c说:“小偷肯定是d。” d说:“c在冤枉人。” 现在已经知道四个人中三人说的是真话,一人说的是假话,问到底谁是小偷? 问题分析:将a, b, c, d将四个人进行编号,号码分别为1,2,3,4。则问题可用枚举尝试法来解决。 算法设计:用变量x存放小偷的编号,则x的取值范围从1取到4,就假设了他们中的某人是小偷的所有情况。四个人所说的话就可以分别写成: a说的话:x!=1 b说的话:x == 3 c说的话:x==4 d说的话:x != 4或not(x ==4) 注意:在x的枚举过程中,当这四个逻辑式的值相加等于3时,即表示“四个人中三人说的是真话,一人说的是假话”。 算法如下:
x= 1
for x in range ( 2 , 4 ) :
if ( ( x!= 1 ) + ( x== 3 ) + ( x== 4 ) + ( x!= 4 ) == 3 ) :
print ( chr ( 64 + x) , "is a thief ." ) ; 、
判断一个4位整数是否为回文数 问题分析:回文数例子,1221是回文数,因为其千位与个位互换,百位和十位互换后,仍是它本身 计算模型:设输入数为n,则有 (1)取出每一位的值 n的千位:a=n//1000 n的百位:b=n//100%10 n的十位:c=n//10%10 n的个位:d=n%10 (2)构成逆序数 m=d * 1000+b * 100+c * 10+a (3)n==m? 代码如下:
n= input ( "请输入一个四位数:" )
n= int ( n)
a= n// 1000
b= n// 100 % 10
c= n// 10 % 10
d= n% 10
m= d* 1000 + c* 100 + b* 10 + a
result= ( n== m)
print ( "回文数的判断结果是:" , result)
判断是否为闰年 问题分析: (1)能被4整除不能被100整除 (2)能被400整除 计算模型:设输入数为y,则有 (1)y%4== 0 and y%100!=0 (2)y%400==0
stry= input ( "请输入年份:" )
y= int ( stry)
result= ( y% 4 == 0 and y% 100 != 0 ) or ( y% 400 == 0 )
print ( "闰年的判断结果为:" , result)
将输入的字符转换为小写,并输出其ASCII值 提示: 条件表达式为 z if x else y 获得字母的ASCII值函数ord() 字符转换函数chr() 大写字母为‘A ’~‘Z’
c= input ( "请输入一个字符:" )
y= ( c if ( c>= 'a' and c<= 'z' ) else chr ( ord ( c) + 32 ) )
print ( "字符:" , c, ",ASCII:" , ord ( c) , ",转换为:" ,
y, ",ASCII:" , ord ( y) )
汉诺(Hanoi)塔问题。
def Hanoi ( n, ch1, ch2, ch3) :
if n== 1 :
print ( ch1, '->' , ch3)
else :
Hanoi( n- 1 , ch1, ch3, ch2)
print ( ch1, '->' , ch3)
Hanoi( n- 1 , ch2, ch1, ch3)
输入两个字符串,求两个字符串共有的最长子串
def substr ( ) :
s1= input ( '输入子串1:' )
s2= input ( '输入子串2:' )
r= ""
m= 0
for i in range ( 0 , len ( s2) ) :
for j in range ( i+ 1 , len ( s2) + 1 ) :
if s2[ i: j] in s1 and m< j- i:
r= s2[ i: j]
m= j- i
print ( "最长公共的子串:" , r)
substr( )
输入一个点分IP地址,即输入形如***.***.***.***的字符串,其中 *** 为0~255之间的整数。编程将IP地址转化为32位二进制形式输出,也就是将 *** 转化为8位二进制数后依次连接起来形成32位二进制数 【问题分析】判断是否为合法IP;将每个地址段转换为二进制数;重新拼接输出
def isVIP ( L) :
if len ( L) != 4 :
return False
for i in range ( 4 ) :
if L[ i] . isdigit( ) == False or int ( L[ i] ) < 0 or int ( L[ i] ) > 255 :
return False
return True
def _10to2 ( num) :
res= ""
while True :
res= str ( num% 2 ) + res
num= num// 2
if num== 0 :
break
while len ( res) < 8 :
res= '0' + res
return res
def _10to2 ( num) :
s= bin ( num)
res= s[ 2 : len ( s) + 1 ] . rjust( 8 , '0' )
return res
def main ( ) :
ipS= input ( 'input IP:' )
L= ipS. split( '.' )
while not isVIP( L) :
print ( "IP is error!" )
ipS= input ( 'input IP,again:' )
L= ipS. split( '.' )
s= ""
for i in range ( 4 ) :
s= s+ ' ' + _10to2( int ( L[ i] ) )
print ( s)
main( )
已知平面上若干点的坐标是a0(1,2), a1(-1,3), a2(2,1.5), a3(-2,0), a4(4,2)。计算任意两的距离并生成距离矩阵,其中,矩阵元素(i, j)表示Ai和Aj之间的距离,最后输出距离矩阵和两点之间最大距离
from math import *
def d ( x1, y1, x2, y2) :
return sqrt( ( x1- x2) ** 2 + ( y1- y2) ** 2 )
def ma ( ) :
x= [ 1 , - 1 , 2 , - 2 , 4 ]
y= [ 2 , 3 , 1.5 , 0 , 2 ]
dd= [ ]
s= 0
for i in range ( len ( x) ) :
dd. append( [ ] )
for j in range ( len ( x) ) :
v= d( x[ i] , y[ i] , x[ j] , y[ j] )
dd[ i] . append( v)
if s< dd[ i] [ j] :
s= dd[ i] [ j]
for i in range ( len ( x) ) :
for j in range ( len ( x) ) :
print ( "%5.2f" % dd[ i] [ j] , end= " " )
print ( )
print ( "max=%5.2f" % s)
输入一段英文文字,统计其中出现的英文单词及其出现次数。要求程序可以过滤掉常见的标点符号,并按下面要求输出: (1)将出现次数大于2的单词按字典序输出 (2)将出现次数大于2的单词按单词出现次数从大到小排序输出 [问题分析]本例的关键是分离单词,但首先要滤掉标点符号。过滤标点可以将常见标点全部 替换为空格或一种标点,然后按这种唯一的标点分离出每个单词。本例要求统计每个单 词的出现次数,可以用字典表示,单词是键,次数是值。
def ma ( ) :
txt= input ( 'input text:' )
wordC= { }
for e in " !;.\t\n\"()-:#@" :
txt= txt. replace( e, ',' )
L= txt. split( ',' )
L. sort( )
while L[ 0 ] . isdigit( ) or L[ 0 ] == '' :
del L[ 0 ]
for e in L:
if e in wordC:
wordC[ e] = wordC[ e] + 1
else :
wordC[ e] = 1
print ( '按字典输出单词及次数(>2):' )
words= list ( wordC. keys( ) )
words. sort( )
for e in words:
if wordC[ e] > 2 :
print ( e, wordC[ e] )
print ( '按字出现频率排序输出(>2):' )
L1= list ( wordC. items( ) )
L1. sort( key= gN, reverse= True )
for i in range ( len ( L1) ) :
if L1[ i] [ 1 ] > 2 :
print ( L1[ i] [ 0 ] , L1[ i] [ 1 ] )
def gN ( x) :
return x[ 1 ]
验证哥德巴赫猜想:任何一个超过2偶数都可以写成两个素数之和。 问题分析: (1)将一个超过2偶数N,分解为两个数之和,如N=k1+k2,分别判断它是否为质数。 (2)找出小于N所有素数,建立一个素数表L,取出一个素数e,判断N-e in L,若为真,则找到此合数素数分解
def pm ( ) :
N= int ( input ( "请输入待验证的偶数n(n>2):" ) )
while N< 3 or N% 2 == 1 :
print ( '不符合要求!' )
N= int ( input ( "请输入待验证的偶数n(n>2):" ) )
pme= set ( )
for i in range ( 2 , N+ 1 ) :
pme. add( i)
for i in range ( 2 , N+ 1 ) :
if i in pme:
for k in range ( 2 * i, N+ 1 , i) :
if k in pme:
pme. remove( k)
for e in pme:
f= N- e
if f>= e and f in pme:
print ( N, '=' , e, '+' , f)
利用生成器构造一个fibonacci函数,生成fibonacci的小于100的数。
def fibonacci ( ) :
a= b= 1
yield ( a)
yield ( b)
while True :
a, b= b, a+ b
yield ( b)
def m ( ) :
for num in fibonacci( ) :
if num> 100 :
break
print ( num, end= ' ' )
读取mp3歌词文件,将时间标签转换成毫秒形式,并将每一句歌词读出来,按时间顺序以“时间(毫秒为单位)歌词”的形式显示每一句
def readLRC ( filename) :
with open ( filename, 'r' ) as f:
res= { }
L= f. readline( )
while L!= '' :
if ( L[ 1 : 3 ] . isdigit( ) and L[ 4 : 6 ] . isdigit( ) and L[ 7 : 9 ] . isdigit( ) and L[ 3 ] == ':' and L[ 6 ] == '.' ) :
t1= ( int ( L[ 1 : 3 ] ) * 60 + int ( L[ 4 : 6 ] ) ) * 1000 + int ( L[ 7 : 9 ] ) * 100
res[ t1] = L[ 10 : ] . rstrip( )
L= f. readline( )
return res
def m ( ) :
fname= input ( '输入MP3歌词文件名:' )
lrcD= readLRC( fname)
for key in sorted ( lrcD) :
print ( key, lrcD[ key] )
m( )
声明一个公民类,包括身份证号、姓名、年龄,声明学生类、教师类继承于公民类,学生类有学号、班级和成绩,教师类有工号、系别、薪水
class C :
def __init__ ( self, id , name, age) :
self. id = id
self. name= name
self. age= age
def __del__ ( self) :
print ( 'bye' )
class S ( C) :
def __init__ ( self, id , name, age, stdno, grade, score) :
super ( S, self) . __init__( id , name, age)
self. stdno= stdno
self. grade= grade
self. score= score
class T ( C) :
def __init__ ( self, id , name, age, Thno, dept, sal) :
super ( T, self) . __init__( id , name, age)
self. Thno= Thno
self. dept= dept
self. sal= sal
定义一个画图类的基本框架,抽象基类包括公共颜色和抽象类draw,子类点包括起点与终点、实现抽象方法draw,子类圆包括圆心与半径。
from abc import ABCMeta, abstractmethod
class S ( object ) :
__metaclass__= ABCMeta
def __init__ ( self) :
self. color= 'black'
@abstractmethod
def draw ( self) : pass
class C ( S) :
def __init__ ( self, x, y, r) :
self. x= x
self. y= y
self. r= r
def draw ( self) :
print ( 'Draw circle:(%d, %d, %d)' % ( self. x, self. y, self. r) )
class Line ( S) :
def __init__ ( self, x1, y1, x2, y2) :
self. x1= x1
self. y1= y1
self. x2= x2
self. y2= y2
def draw ( self) :
print ( 'Draw line: ( % d, % d, % d,
% d) '% ( self. x1, self. y1, self. x2, self. y2) )
def f ( ) :
c= C( 10 , 10 , 5 )
l= Line( 5 , 5 , 15 , 15 )
lst= [ ]
lst. append( c)
lst. append( l)
for k in range ( len ( lst) ) :
lst[ k] . draw( )