python算法题

python几道简单的算法题

 

最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧。

1.题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

复制代码
if __name__ == "__main__":
    s =  (1,2,3,4)
    for a in s:
        for b in s:
            for c in s:
                if a != b and b != c and c != a:
                    print "%d%d%d" %(a,b,c)
复制代码

2.题目:一个整数,它加上100后是一个完全平方数,再加上268又是一个完全平方数,请问该数是多少?
程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:

复制代码
from math import sqrt

if __name__ == "__main__":
    i = 1
    while i < 100000:
        a = int(sqrt(i + 100))
        b = int(sqrt(i + 268))
        if a **2 == (i + 100) and b **2 == (i + 268):
            print i
        i += 1
复制代码

3.题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

复制代码
if __name__ == "__main__":
    days = {1:0,2:31,3:59,4:90,5:120,6:151,7:181,8:212,9:243,10:273,11:304,12:334}
    year,month,day = input("year:"),input("month:"),input("day:")
    if not days.has_key(month):
        print "error input"
    sum = days[month] + day
    if month >= 2:
        if year %400 == 0 or (year % 4 == 0 and year % 100 != 0):
            sum += 1
    print "it is the %dth day of the year." % sum
复制代码

4.题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。

if __name__ == "__main__":
    a,b,c = input(),input(),input()
    if a > b: a,b = b,a
    if a > c: a,c = c,a
    if b > c: b,c = c,b
    print "small to big: %d,%d,%d" %(a,b,c)

或者:

if __name__ == "__main__":
    s = [input(),input(),input()]
    s.sort()
    print "small to big: %s" %s

5.题目:输出9*9口诀。
程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

if __name__ == "__main__":
    for i in range(1,10):
        for j in range(1,10):
            print "%d*%d = %-3d" %(i,j,i*j),
        print 

6.题目:要求输出国际象棋棋盘。

程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。

复制代码
if __name__ == "__main__":
    for i in range(8):
        for j in range(8):
            if (i + j) % 2 ==  0:
                print "%c"%219,else:
                print "a",
        print 
复制代码

7.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....

复制代码
if __name__ == "__main__":
    f1,f2 = 1,1
    print "1: %d" %f1
    print "2: %d" %f2
    for i in range(3,21,2):
        f1 = f1 + f2
        print "%d: %d" %(i,f1)
        f2 = f1 + f2
        print "%d: %d" %(i+1,f2) 
复制代码

8.题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

复制代码
from math import sqrt

if __name__ == "__main__":
    count = 0
    flag = 1
    for a in range(101,201):
        s = int(sqrt(a))
        for i in range(2,s+1):
            if a % i == 0:
                flag = 0
                break
        if flag == 1:
            count += 1
            print a
        else:
            flag = 1
    print "the total num is %d" %count
复制代码

9.题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

if __name__ == "__main__":
    print "water flower number is :",
    for a in range(100,1000):
        x,y,z = a/100,a/10%10,a%10
        if x**3 + y**3 + z**3 == a:
            print "%d,"%a,

10.题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

复制代码
if __name__ == "__main__":
    n = input("please enter a number:")
    print "%d = " %n,
    for k in range(2,n+1):
        while n != k:
            if n % k == 0:
                n = n/k
                print "%d * " %k,
            else:
                break
    print n  
复制代码

11.题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
程序分析:利用辗除法。

复制代码
if __name__ == "__main__":
    print "please enter two numbers:"
    s = [input(),input()]
    s.sort()
    a,b = s[0],s[1]
    while b != 0:
        t = a % b
        a = b
        b = t
    print "common divisor:%d"%a
    print "common multiple:%d"%int(s[0]*s[1]/a)
复制代码

12.题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值。

复制代码
if __name__ == "__main__":
    print "please enter a and n:"
    a,n = [input(),input()]
    sum = a
    if n > 1:
        b = a
        for i in range(2,n+1):
            b = a + b*10
            print b
            sum += b
    print "a+aa+aaa+... = %ld " %sum
复制代码

13.题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

程序分析:因子就是所有可以整除这个数的数,不包括这个数自身。

复制代码
if __name__ == "__main__":
    for n1 in range(3,1001):
        sum = 1
        n = n1
        for k in range(2,n+1):
            while n != k:
                if n % k == 0:
                    n = n/k
                    sum += k
                else:
                    break
        sum += n
        if sum == n1:
            print sum
复制代码

14.题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。

if __name__ == "__main__":
    s1 = 1
    for day in range(10,1,-1):
        s2 = (s1+1)*2
        s1 = s2
    print "the total number is %d" %s1

15.题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

复制代码
if __name__ == "__main__":
    for x in ["a","b","c"]:
        if x != "a" and x != "c":
            print "x:%s"%x
            for z in ["a","b","c"]:
                if z != x and z != "c":
                    print "z:%s"%z
                    for y in ["a","b","c"]:
                        if y != x and y != z:
                            print "y:%s"%y
复制代码

16.题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
程序分析:请抓住分子与分母的变化规律。

复制代码
if __name__ == "__main__":
    a,b,s = 2,1,0
    for n in range(1,21):
        s += a/b
        a = a+b
        b = a-b
    print "sum = %.3f" %s
复制代码

17.题目:求1+2!+3!+...+20!的和
程序分析:此程序只是把累加变成了累乘。

复制代码
if __name__ == "__main__":
    a,s = 1,1
    for n in range(2,21):
        for i in range(1,n+1):
            a *= i
        s += a
        a = 1
    print "sum = %d" %s
复制代码

18.题目:利用递归方法求5!。
程序分析:递归公式:fn=fn_1*4!

复制代码
def fact(j):
    if j == 0:
        sum = 1
    else:
        sum = j * fact(j-1)
    return sum

print fact(5)
复制代码

随笔分类 - Python学习

 
摘要: http://www.oschina.net/question/12_27127#INSTALLhttp://www.360doc.com/content/11/0606/23/54470_122122538.shtml照着以上的文章写了如下的代码,对于我这个不怎么写代码的人来说,敲出如下的代码好艰辛,有木有~~~~(>_<)~~~~一 main方法自动执行所有test如果你之前已经使用test*惯例对测试方法进行命名,那么你就可以将以下代码插入测试模块的结尾:if __name__ == "__main__": unittest.main()当你从命令行执行你阅读全文
posted @ 2014-03-19 11:42 邦邦酱好 阅读(46) | 评论 (0) 编辑
 
摘要: 最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧。1.题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。if __name__ == "__main__": s = (1,2,3,4) for a in s: for b in s: for c in s: if a != b and b != c and c != a: ...阅读全文
posted @ 2013-11-27 15:19 邦邦酱好 阅读(255) | 评论 (2) 编辑
 
摘要: 这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等。目前支持python的所谓“GUI工具包”的有很多,本文简要介绍最成熟的跨平台pythonGUI工具包---wxPython。一. 下载和安装wxPython1.1 下载访问下载页面:http://wxpython.org/download.php即可。要注意以下几点:1. 如果是windows系统,应该下载预建的二进制版本,可以选择支持Unicode或不支持Unicode,除非一定要用到Unicode,否则2个版本的区别不大;2. 确保所选择的二进制版本要对应Python版本,比如python2.阅读全文
posted @ 2013-11-13 16:14 邦邦酱好 阅读(736) | 评论 (0) 编辑
 
摘要: 这里将介绍函数和对象--文件和流,让你在程序调用期间存储数据,并且可以处理来自其他程序的数据。一. 打开文件1.1 open函数open函数用来打开文件,语法如下:open(name,[.mode[.buffer]])它有唯一一个强制参数,就是文件名,然后返回一个文件对象。参数-模式和缓冲都是可选的。使用范例:(如果文件不存在,就会报错)>>> f = open('c:\text\test.txt') #windows下Traceback (most recent call last): File "", line 1, in f = 阅读全文
posted @ 2013-11-13 09:12 邦邦酱好 阅读(612) | 评论 (0) 编辑
 
摘要: Python的标准安装包括一组模块,称为标准库。这里介绍模块的工作方式,学习如何使用它们。一. 模块1.1 用import从外部模块获取函数并为自己的程序所用:>>> from math import sqrt>>> import math1.2 编写自己的模块任何python程序都可以作为模块导入。程序保存的位置很重要。假设我们所写的程序叫hello.py被保存在c:/python目录下,可以执行以下的代码,告诉解释器在哪里寻找hello.py模块:#hello.pyprint "hello,world!">>> im阅读全文
posted @ 2013-11-12 14:01 邦邦酱好 阅读(1124) | 评论 (0) 编辑
 
摘要: 一. 迭代器在前面的笔记中,已经提到过迭代器(和可迭代),这里会对此进行深入讨论。只讨论一个特殊方法---__iter__,这个方法是迭代器规则的基础。1.1 迭代器规则 迭代的意思是重复做一些事情很多次,到现在为止只是在for循环中对序列和字典进行迭代,但实际上也能对其他的对象进行迭代:实现__iter__方法的对象。 __iter__方法返回一个迭代器,所谓迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。 为什么不用列表?列表是一次阅读全文
posted @ 2013-11-11 10:45 邦邦酱好 阅读(587) | 评论 (1) 编辑
 
摘要: 在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法)。如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名字)被python调用。而几乎没有直接调用它们的必要。 这里会详细讨论一些重要的魔法方法(最重要的是__init__方法和一些处理对象访问的方法,这些方法允许你创建自己的序列或者是映射),还会处理属性(通过property函数来处理)。一. 构造方法1.1 介绍与创建 首先要讨论的第一个魔法方法是构造方法,它代表着类似于以前例子中使用过的那种名为init的初始化方法。但构造方法和其他普通方法不同.阅读全文
posted @ 2013-11-08 16:12 邦邦酱好 阅读(840) | 评论 (6) 编辑
 
摘要: Python被称为面向对象的语言,创建自己的对象是python非常核心的概念。这里会介绍如何创建对象,以及多态,封装,方法,特性,超类以及继承的概念。一. 对象的魔力面向对象程序设计中的术语 对象 基本上可以看做数据以及由一系列可以存取,操作这些数据的方法所组成的集合。对象最重要的几个有点包括以下几个方面:(1)多态:意味着可以对不同类的对象使用同样的操作,它们会像被施了魔法一样工作;(2)封装:对外部世界隐藏对象的工作细节;(3)继承:以普通的类为基础建立专门的类对象;1.1 多态 多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象类型的不同而表现出不同的行阅读全文
posted @ 2013-11-07 16:44 邦邦酱好 阅读(59) | 评论 (2) 编辑
 
摘要: 本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途。一. 创建函数函数是可以调用,它执行某种行为并且返回一个值。用def语句即可定义一个函数:(并非所有的函数都会返回一些东西)def fibs(num): result = [0,1] for i in range(num-2): result.append(result[-2]+result[-1]) return result记录函数如果想给函数写文档以便让人理解的话,可以加入注释(以#开头)。另一个方式就是直接写上字符串,它会作为函数的一部分进行存储,这成为文档...阅读全文
posted @ 2013-11-01 14:39 邦邦酱好 阅读(461) | 评论 (0) 编辑
 
摘要: 前面已经介绍过几种基本语句(print,import,赋值语句),下面我们来介绍条件语句,循环语句。一. print和import的更多信息1.1 使用逗号输出A.打印多个表达式,用逗号隔开,会在每个参数之间插入一个空格符:>>> print 'age:',42age: 42B.同时输出文本和变量值,却又不希望使用字符串格式化:>>> name = 'Peter'>>> greeting = 'Hello'>>> print greeting,',',name阅读全文
posted @ 2013-10-31 15:25 邦邦酱好 阅读(499) | 评论 (2) 编辑
 
摘要: 字典是python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的键(key)里。键可以是数字,字符串甚至是元组。1. 创建和使用字典字典可以通过下面的方式创建:phonebook = {'Alice':'2341','Beth':'9102','Ceil':'3258'}字典由多个键及与其对应的值构成的对组成。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来。空字典:{}1.1 dict函数可以用dict函数通过映射(比如其他字典)阅读全文
posted @ 2013-10-30 13:58 邦邦酱好 阅读(510) | 评论 (0) 编辑
 
摘要: 这里会介绍如何使用字符串格式化其他的值,并了解一下利用字符串的分割,连接,搜索等方法能做些什么。1.基本字符串操作所有标准的序列操作(索引,分片,乘法,判断成员资格,求长度,取最大值和最小值)对字符串同样适用。但是要千万记住:字符串是不可变的。因此下面的分片赋值是不合法的:>>> website = "www.python.org">>> website[-3:] = "com"TypeError:object doesn't support slice assignment2.字符串格式化:精简版字符串格式化阅读全文
posted @ 2013-10-29 16:26 邦邦酱好 阅读(72) | 评论 (2) 编辑
 
摘要: 最近在看《python基础教程》(基于python2.x),下面总结一下第二章列表与元组的知识: 在这章中引入了数据结构的概念。数据结构是通过某种方式组织在一起的数据元素的集合。在python中,最基本的数据结构就是序列。序列中的每个元素被分配一个序号,即元素的位置,也被称为索引。注意:第一个索引是0。1.序列概览 python有6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象。 这里重点介绍列表和元组。列表和元组主要区别在于,列表可以修改,元组不可修改。一般来说,在几乎所有情况下列表都可以代替元组。 在需要操作一组数值的时候,序列很好用:Edwar阅读全文
posted @ 2013-10-28 11:31 邦邦酱好 阅读(153) | 评论 (0) 编辑
 
摘要: 1.enumerate:返回2个值,1是当前的for循环的第几轮,2是循环得到的数值enumerate works by supplying a corresponding index to each element in the list that you pass it. Each time you go through the loop, index will be one greater, and item will be the next item in the sequence.choices = ['pizza', 'pasta', 'sa阅读全文
posted @ 2013-10-21 11:25 邦邦酱好 阅读(61) | 评论 (0) 编辑
 
摘要: 关于string的split 和 join 方法对导入os模块进行os.path.splie()/os.path.join() 貌似是处理机制不一样,但是功能上一样。1.string.split(str=' ',num=string.count(str)): 以str为分隔,符切片string,如果num有指定值,则仅分隔num个子字符串。 S.split([sep [,maxsplit]]) -> 由字符串分割成的列表 返回一组使用分隔符(sep)分割字符串形成的列表。如果指定最大分割数,则在最大分割时结束。如果分隔符未指定或者为none,则分隔符默认为空格。注意:分隔阅读全文
posted @ 2013-10-21 10:37 邦邦酱好 阅读(112) | 评论 (0) 编辑
 
摘要: print的即时打印会导致换行,要使得print的输出不换行,可以在字符串或者变量后面加个逗号(“,”),如下:s = "A bird in the hand..."for c in s: if c.lower() == 'a': print "X", else: print c,阅读全文
posted @ 2013-10-18 11:55 邦邦酱好 阅读(37) | 评论 (0) 编辑
 
摘要: list:创建:list = [5,7,9]取值和改值:list[1] = list[1] * 5列表尾插入:list.append(4)去掉第0个值并返回第0个值的数值:list.pop(0)去掉第0个值但不返回数值:del(list[0])去掉具体某个值:list.remove(35)函数function:无参数:def function():一个参数:def function(x):2个参数:def function(y):任意个参数:def add_function(*args):函数range:一个参数:range(n) 从第0位开始数n个位两个参数:range(m,n) 从第m位开阅读全文
posted @ 2013-10-18 09:34 邦邦酱好 阅读(47) | 评论 (0) 编辑
 
摘要: 推荐一个学习语言的网站:http://www.codecademy.com有教程,可以边学边写,蛮不错的。for循环:1.for loops allow us to iterate through all of the elements in a list from the left-most (or zeroth element) to the right-most element. A sample loop would be structured as following:使用for循环可以遍历一个列表,从最左到最右:a = ["List of some sort”]for x阅读全文
posted @ 2013-10-17 10:41 邦邦酱好 阅读(83) | 评论 (3) 编辑
 
分类: Python学习
原文地址:https://www.cnblogs.com/Leo_wl/p/4317143.html