# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
"""
Created on Wed Dec 07 18:43:25 2016
趣味百题之趣味猜想
@author: onlyyo
"""
# 1.
'''角谷猜想的内容为:任意给定一个自然数,若它为偶数则除以2,
若它为奇术则乘3加1,得到一个新的自然数。按照这样的计算方法计算下去,
若干次后得到的结果必然为1。编写程序对角谷猜想的正确性加以验证。
'''
def fun1(n):
while True:
if n%2 == 0:
n = n/2
else:
n = 3*n + 1
if n==1:
return 1
break
# print fun1(10)
# 2.
'''“回文数”是一种数字。如:98789,这个数字正读是98789,倒读也是98789,
正读倒读一样,所以这个数字就是回文数。编程判断一个数是否是回文数。
'''
def fun2(n):
a = []
while n:
a.append(n % 10)
n /= 10
for i in xrange(len(a)):
if a[i] != a[-i-1]:
break
else:
print '回文数'
return True
print '非回文数'
return False
# fun2(78987)
# 3.
'''任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,
组成一个较大的数和一个较小的数,然后用较大的数减去较小数,不够四位数时补零,
类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。'''
def fun3(n):
if n == 6174:
print "{0}是一个布列克常数!".format(n)
while True:
lista = list(str(n))
lista.sort()
Max = int(lista[3])*1000 + int(lista[2])*100 + int(lista[1])*10 + int(lista[0])
Min = int(lista[0])*1000 + int(lista[1])*100 + int(lista[2])*10 + int(lista[3])
n = Max - Min
if n < 1000:
n = n*10
if n == 6174:
print "{0}是一个布列克常数!".format(n)
break
#fun3(4321)
#4.
'''“今有物不知其数,三三数之乘二,五五数之乘三,七七数之乘二,问物几何?”
按照今天的话来说:一个数除以3余2,除以5余3,除以7余2。 '''
def fun4():
n = 1
while True:
if n % 3 == 2:
if n % 5 == 3:
if n % 7 == 2:
print n
break
else:
n += 1
continue
else:
n += 1
continue
else:
n += 1
continue
fun4()
# 5.
'''
验证尼克斯彻定理,即任何一个整数的立方都可以写成一串连续奇数的和,如下所示:
1³ =1
2³=3+5
3³=7+9+11
4³=13+15+17+19
......'''
def fun5(n):
z = n**3
a = n**2 - n + 1
temp = []
for i in xrange(n):
temp.append(a + 2*i)
if sum(temp) == z:
return temp
print temp
#l = fun5(6)
#6.
'''国际象棋的棋盘有8行8列共64个单元格,无论将马放于棋盘的哪个单元格,都可让马踏遍棋盘的
每个单元格。问马应该怎么走才可以踏遍棋盘的每个单元格?'''
# 遍历64个格子,--------------不太懂
L = 8
M = [0] * (L * L)
def allEntry(x, y, m):
t = [(x + i, y + k * 2 / i) for i in (-1, 1, -2, 2) for k in (-1, 1)]
return [(ex, ey) for ex, ey in t if -1 < ex < L and -1 < ey < L and m[L * ex + ey] == 0]
def sortedEntryList(x, y, m):
a = [8]
res = []
for ex, ey in allEntry(x, y, m):
c = len(allEntry(ex, ey, m))
for i, t in enumerate(a):
if c <= t: break
a.insert(i, c)
res.insert(i, (ex, ey))
return res
def show(m):
print 'show:'
for i in xrange(L):
print m[i * L:i * L + L]
print
def move(x, y, m, n):
m[L * x + y] = n
if n == L * L:
show(m)
return
for ex, ey in sortedEntryList(x, y, m):
move(ex, ey, m[:], n + 1)
move(0, 0, M, 1)
趣味百题之趣味猜想
最新推荐文章于 2024-03-04 07:00:00 发布