趣味百题之趣味猜想

本文介绍了几个有趣的数学猜想,并提供了Python实现,包括角谷猜想、回文数判断、卡布列克常数、中国剩余定理问题以及尼克斯彻定理的验证。通过编程探索这些数学规律,增加学习的趣味性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- 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)
    
    
    
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值