1.输入一个正整数n,对其进行因式分解并输出。
例如:输入18,输出18=2*3*3
解题思路:
①最小的质数为2,每次从2开始遍历,只要 n % i == 0 , i 为当前n的最小质数,n = n / i 作为新的正整数,跳出当前循环,再次从2开始遍历
②遍历至 n = i 时表示因式分解过程已结束
方法一:
a = int(raw_input("请输入一个整数:")) b = "" d = a q = 1 print "n = %d" % a while q: if a == 1: break for i in xrange(2, a+1): if a == i: q = 0 break if a % i == 0 : b += '%s * ' % i a = a / i break print "%s = %s%s" % (d, b, a)
方法二:
from sys import stdout n = int(raw_input("请输入一个正整数:")) b = n print "n = %s" % n stdout.write(str(n)+ " = ") for i in range(2, n+1): while n != 1: if n % i == 0: n = n/i if n == 1: n = n * i break stdout.write(str(i)) stdout.write("*") else: break print "%d" % n
PS. print 和 sys.stdout的区别
实际上我们在调用 print (对象) 时,实际上是调用了sys.stdout(对象+'\n'),print 比sys.stdout多了一个换行符,所以在不需要换行的情况下追加字符串可以使用sys.stdout
2. 输入一行字符, 分别统计出其中英文字母、空格、数字和其它字符的个数。
解题思路:利用python的内置函数进行统计
s = raw_input("请输入一行字符串:") letters = 0 space = 0 digit = 0 other = 0 print len(s) for i in s:
//判断是否为字母 if i.isalpha(): letters += 1
//判断是否为空格 elif i.isspace(): space += 1
//判断是否为数字 elif i.isdigit(): digit += 1 else: other += 1 print '字母数量为%d, 空格数量为%d, 数字数量为%d, 其他数量为%d' % (letters, space, digit, other)
方法一:
a = int(raw_input("请输入一个数值:")) n = int(raw_input("请输入次数:")) sum = 0 s = '' for i in xrange(n): b = int(('%d'% a) *i) sum += b s += '%s + '% str(b) print 'sum = '+ s[:-2] + ' = %d'%sum方法二:
Tn = 0 Sn = [] s = '' a = int(raw_input("请输入一个数字:")) n = int(raw_input("请输入数量:")) for count in xrange(n): Tn = Tn + a a = a * 10 Sn.append(Tn) s += '%s + ' % str(Tn) Sn = reduce(lambda x,y: x + y, Sn) print 'sum = %s = %d' % (s[:-2],Sn)
4.一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求他在第10次落地时,共经过多少米?第10次反弹多高?
h = 100
hsum = 100
for i in xrange(1, 11):
h = 0.5 * h
hsum += h * 2
print hsum, h
5.一只青蛙一次可以跳上1级台阶,也可以跳上2级,求该青蛙跳上一个n级台阶总共有多少种跳法?
解题思路:青蛙一次只能跳1级或者2级台阶,那当青蛙要跳上n级台阶时,只能处于n-1台阶,或者n-2台阶这两种情况。如果用函数f(n)表示跳上n级台阶的跳法总数,那么青蛙在n-1级台阶时有f(n-1)种跳法,在n-2级台阶时有f(n-2)种跳法,由于最后跳上n级台阶只有两种跳法,那么总的跳法就是f(n) = f(n-1) + f(n-2)
其实这是一个斐波那契数列
方法一:
fib = lambda n: n if n <= 2 else fib(n-1) + fib(n-2) fib(n)方法二:
def fib(n): a = 0 b = 1 for _ in xrange(n): a, b = b, a+b return b fib(n)
6.一只青蛙一次可以跳上1,2,3...n阶台阶,求该青蛙跳上一个n级的台阶有多少种方法?
解题思路:类比第5题,第五题是因为一次只能跳1或者2阶,那第n阶就是f(n) = f(n-1) + f(n-2)
现在是能跳1-n阶,则类比推出是f(n) = f(n-1) + f(n-2) + f(n-3) +...+ f(n-(n-1)) + f(n-n) = f(0) + f(1) + f(3) +...+ f(n-2) + f(n-1) = f(n-1) + f(n-1) = 2*f(n-1)
fib = lambda n: n if n <= 2 else fib(n-1) * 2 fib(n)7.L=[1,2,3,1,2,3,2,4]要求:1.排序从大到小 2.过滤相同的数,相同的个数越多,排在前面 3.个数相同,元素从小到大排列
L = [1,2,3,1,2,3,2,4] # 将列表转为字典 a = dict.fromkeys(L, 0) # 对重复的数字进行遍历统计 for i in L: if i in a: a[i] += 1 L = [(k, v) for k,v in a.iteritems()] # 利用冒泡排序对其进行排序 for i in xrange(len(L)): for j in xrange(len(L)-1): if L[j][1] < L[j+1][1]: L[j], L[j+1] = L[j+1], L[j] elif L[j][0] < L[j+1][0]: L[j], L[j+1] = L[j+1], L[j] print L # [(2, 3), (3, 2), (1, 2), (4, 1)] # 将结果以列表形式输出 res = [i[0] for i in L] print res # [2, 3, 1, 4]
8.去除列表中的重复元素,L=['b', 'c', 'd', 'c', 'b', 'a', 'a']
方法一:使用set
# 使用set,set使用之后会生成新的对象,对原对象不做改变,所以需要赋值给一个新的变量 L=['b', 'c', 'd', 'c', 'b', 'a', 'a'] L2 = list(set(L)) L2.sort() print L2 # ['a', 'b', 'c', 'd']方法二:通过列表生成
L=['b', 'c', 'd', 'c', 'b', 'a', 'a'] L2 = [] [L2.append(x) for x in L if x not in L2] print L2 # ['b', 'c', 'd', 'a']方法三:通过字典生成
L=['b', 'c', 'd', 'c', 'b', 'a', 'a'] L2 = dict.fromkeys(L).keys() print L2 # ['a', 'c', 'b', 'd']
9.合并有序列表(尾递归),L1=[1,3,5,7,9],L2=[2,4,6,8]
解题思路:因为两张表都是有序列表,每次对两表的第一个数进行比较大小,小的就添加进新的列表,并在原列表中删除,依次重复,直至有一张表为空,则另一张表剩余的数就添加至新表尾部
方法一:
def Combine(L1, L2, tmp): # 如果有一个列表为空,则直接将表添加进tmp尾部 if not L1 or not L2: tmp.extend(L1) tmp.extend(L2) return tmp else: # 对两张表的第一个数进行比较,小的就添加进tmp,并删除列表中该数,依次重复,直至有一张表为空 if L1[0] < L2[0]: tmp.append(L1[0]) del L1[0] else: tmp.append(L2[0]) del L2[0] return Combine(L1, L2, tmp) L1 = [1, 3, 5, 7, 9] L2 = [2, 4, 6, 8] tmp = [] Combine(L1, L2, tmp) print tmp # [1, 2, 3, 4, 5, 6, 7, 8, 9]方法二:
L1 = [1, 3, 5, 7, 9] L2 = [2, 4, 6, 8] tmp = [] while L1 and L2: if L1[0] < L2[0]: tmp.append(L1[0]) del L1[0] else: tmp.append((L2[0])) del L2[0] tmp.extend(L1) tmp.extend(L2) print tmp # [1, 2, 3, 4, 5, 6, 7, 8, 9]
10.二分法查找
二分法查找就是通过不断对半的方法查找区间[a,b]内的数值位置
def binarySearch(L, t): x=0 low, high = 0, len(L) - 1 while low < high: mid = (low + high)/2 if L[mid] > t: high = mid elif L[mid] < t: low = mid +1 else: return mid return mid if L[mid-1] == t else False print binarySearch([1,2,3,4,5,6,7,8,9,10], 4)