天天看点

python趣味百题之10题 (包含做题时的想法笔记和代码)

1.尾数前移

#coding:utf-8
#python趣味百题1
#1.尾数前移:一个数的末位移到首位,等于原来的数的4倍
#1234->4123,1234*4=?4123
#求一个自然数N,个位数是6,将6提到最前面所得数是N的4倍?

#求一个自然数N,个位数是8,将8提到最前面所得数是N的4倍?

def fun(n):
        nn = n
        t = 6
        while nn > 0:
                t *= 10
                nn //= 10

        m = n * 10 + 6
        if t + n == m * 4:
                print(m)
for i in range(1,100000):
        fun(i)
           

2.水仙花数

#coding=utf-8
#python趣味百题2 水仙花数(100-999)
#这种算法可移植性太差了!可以用其他算法,直接改range()就能获得其他需求
def fun(n):
        a = n / 100
        b = n / 10 % 10
        c = n % 10
        if a ** 3 + b ** 3 + c ** 3 == n:
                print(n)

for i in range(100,1000):
        fun(i)

e=[1,3,5,7,9]
print([x ** 3 for x in e])
print(sum([x ** 3 for x in e]))

#以上用到列表解析:
'''
a=[1,3,5,7,9]
sum([x ** 3 for x in a])        
'''
           

3.不重复的3位数

#coding=utf-8
#python趣味百题3
#不重复的三位数
#0-9可以组成多少个不重复的3位数?
'''
3位数的个,十,百分别表示为a,b,c
a可以取1-9,不能取0
b可以取0-9
c可以0-9
算法可以为:第一种
sum = 0
for i in range(1,1000):
        a = i % 10
        b = i / 10 % 10
        c = i / 100
        if c == 0:
                continue
        if a == b or b == c or c == a:
                continue
        else:
                print(i)
                sum += 1
        print(sum)
'''
def NotRepeat():
        l = range(10)
        count = 0
        for a in l[1:]:
                for b in l:
                        if a == b:
                                continue
                        for c in l:
                                if c != a and c != b:
                                        print(a,b,c)
                                        count += 1
        print(count)

NotRepeat()
           

4.自守数

#coding=utf-8
#python趣味百题4 自守数
#求10000以内的自守数?
#例子:5×5=25,6×6=36,76×76=5776等等
#思路:
'''
设自守数为i,计算i的位数l,i**2=n,n的后l位数等于i,即为所求。
'''


for i in range(1,10000):
        l,j = 1,i
        while j / 10 != 0:
                l += 1
                j /= 10
        n = i ** 2
        if n % (10 ** l) == i:
                print(i)

#多用新算法,见下,多次看到列表解析了,好用。           
#用列表解析法一行搞定
print([n for n in range(1,10000) if n * n % (10 ** len(str(n))) == n])
           

5.孪生素数

#coding=utf-8
#python趣味百题5 孪生素数
#若两个素数之差为2,则这两个素数就是孪生素数
#找出1-100之间的孪生素数
'''
设i为要找的数,
'''


def fun():
        l = []
        if True:
                for i in range(2,100):
                        for j in range(2,i):
                                if i % j == 0:
                                        break
                                else:
                                        continue
                        else:
                                l.append(i)
        print(l)
        for i in range(1,len(l)):
                if l[i] - l[i-1] == 2:
                        print("%d,%d是孪生素数"%(l[i],l[i+1]))

fun()
           

6.可逆素数

#coding-utf-8
#python趣味百题6 可逆素数
#找出1-1000内的所有可逆素数
#可逆素数是指一个素数的各位数值顺序颠倒后得到的数仍为素数,如113和311
#思路:
'''
应该先判断位数吧,设此数为n,
if n / 10 != 0:
        l += 1
        n /= 10
print(l) #求几位数

s = n / 10
m = n % 10 #取个位数
nn = m * (10 ** l) + s
if 



'''

def fun():
        l = []
        if True:
                for i in range(10,1000):
                        for j in range(2,i):
                                if i % j == 0:
                                        break
                                else:
                                        continue
                        else:
                                l.append(i)
        print(l)
        for n in l:
                le = 0
                temp = n
                while temp // 10 > 0:
                        le += 1
                        temp //= 10
                #print(le) #求几位数
                if le >= 2:
                        r = n // 100
                        s = n // 10 % 10
                else:

                        s = n // 10 #取十位数
                m = n % 10 #取个位数
                if le >= 2:
                        nn = m * (10 ** le) + s * (10 ** (le-1)) + r
                else:
                        nn = m * (10 ** le) + s
                if nn in l and nn != n:
                        print("%d和%d为可逆素数"%(n,nn))
                        l.remove(nn)
fun()

#视频介绍的算法不算好,总体算法还是用以上的,不过学到了一个细节:
'''
比如有一个数n=123
要变成321,可以简单地用索引操作和int、str的函数来操作:

n = 123
print(int(str(n)[::-1]))
就得到321了
'''
n = 123
print(int(str(n)[::-1]))
           

7.等差素数数列

#coding=utf-8
#python趣味百题7 等差素数数列
#类似 7 37 67 97 或者107 137 167 197这样由素数组成的数列叫做等差素数数列
#首先是求出指定范围以内所有的素数
#然后再去取a0,a1,这个是任意的,所以要在素数列表里面找
#下题求的是200以内的所有等差素数数列

def fun():
        l = []
        if True:
                for i in range(2,200):
                        for j in range(2,i):
                                if i % j == 0:
                                        break
                                else:
                                        continue
                        else:
                                l.append(i)
        print(l)
        le = []
        for k in range(1,len(l)):
                for p in range(k,len(l)):
                        m = l[p] - l[k-1]
                        temp = l[p] + m
                        if temp in l:
                                le = [l[k-1],l[p],temp]
                                while temp + m in l:
                                        le.append(temp + m)
                                        temp += m
                                print(le)
                                del le


#[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]       
fun()
           

8.赛场统分

#coding=utf-8
#python趣味百题8 赛场统分
#有n个裁判计分,打出n个评分,最终要去掉一个最高分,去掉一个最低分
#剩下的n-2个求平均值即为选手的最终打分成绩
'''
思路:

'''

def fun(n):
        import random
        ls = []
        for i in range(n):
                ls.append(random.randint(1,100))
        ls.sort()
        del(ls[0])
        del(ls[n-2])
        print(sum(ls) / (n-2))
fun(100)
           

9.回文数

#coding=utf-8
#python趣味百题9 回文数 一个数正读和倒读都一样
#判断一个数是不是回文数
'''
思路:
98789 -> 98789

def fun(n):
        
'''

def fun(n):
        ls = []
        while n > 0:
                m = n % 10
                n //= 10
                ls.append(m)
        #print(ls)
        for i in range(len(ls) // 2):
                #print(ls[i])
                #print(ls[(-i - 1)])
                if ls[i] == ls[(-i - 1)]:
                        continue
                else:
                        return False
        return True
a = fun(7675)
print(a)
           

10.埃及分数式

#coding=utf-8
#python趣味百题10 埃及分数式
#埃及分数式:只使用分子是1的分数,因此这种分数也叫作埃及分数式
#举个栗子:3/7 = 1/3 + 1/11 + 1/231
#要求输入一个真分数,将该分数分解为埃及分数式
'''

'''

def fun(a,b):
        ls = []
        k = int(b / a)
        if b % a == 0:
                res = '1 / %s' % k
        else:
                k += 1
                res = '1 / %s + %s' % (k, fun(a * k -b, b * k))
        return res
a,b = eval(input()),eval(input())
print("%d / %d = "%(a,b) + fun(a,b))

#以上可以自定义输入,还能看到输入的结果,加个eval(input())即可
           

谢谢观看,继续努力。