天天好味道

没钱没权没户口,靠走靠吼靠小狗
随笔 - 66, 文章 - 1, 评论 - 524, 引用 - 5

导航

<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(12)

随笔分类

随笔档案

文章档案

我的链接

搜索

最新评论

阅读排行榜

评论排行榜

一小段Python程序

刚才敲得,先放这,学数学的也许知道这段程序是穷举Kaprekar Number的,呵呵.
def check(a,b,c,d):
    n 
= a*1000 + b * 100  + c * 10 + d - (d*1000+c*100+b*10+a)
    i 
= 0
    oldresult 
= 0
    
while True:
        i 
= i + 1
        s 
= [(n%1000%100%10),(n/10%100%10),(n/100%10),n/1000]
        s.sort()
        n 
= s[0+ s[1]*10 + s[2]*100+s[3]*1000
        r 
= s[3+ s[2]*10 + s[1]*100+s[0]*1000
        nn 
= n - r
        
if nn == oldresult:
            #print 
"the result for ",a,b,c,d,"is ",nn
            
break
        elif i 
> 9999:
            print a,b,c,d,
"failed"
            
break
        n 
= nn
        oldresult 
= nn
        
for a in range(10):
    
for b in range(10):
        
for c in range(10):
            
for d in range(10):
                
if a == b and b == c and c == d:
                    
continue
                elif a 
< b or b < c or c < d:
                    
continue
                
else:
                    check(a,b,c,d)
print 
"Done"                

posted on 2006-08-14 23:28 jzhang 阅读(2401) 评论(11)  编辑 收藏

评论

# re: 一小段Python程序

呵呵,雷劈数啊,我小时候用手算过,不过方法稍微巧妙一点
2006-08-15 00:09 | lostpencil

# re: 一小段Python程序

郁闷,画了画居然没有画出来,想来小时候的东西应该是错了,呵呵
2006-08-15 00:20 | lostpencil

# to[lostpencil]

我怎么看不出来是雷劈数阿。难道真的是?我刚搜索到的雷劈数定义:

有位外国数学家叫卡普利加,在一次旅行中,遇到猛烈的暴风雨,电闪雷鸣过后,他看到路边一块里程碑,被雷电劈成两半,一半上刻着30,另一半刻着25。这时,卡普利加的脑际中忽然发现了一个绝妙的数学关系——

30+25=55 55^2=3025

把劈成两半的数加起来,再平方,正好是原来的数字。除此之外,还有没有别的数,也具有这样的性质呢?
2006-08-15 08:21 | 晓寒

# re: 一小段Python程序

完整的故事

有位外国数学家叫卡普利加,在一次旅行中,遇到猛烈的暴风雨,电闪雷鸣过后,他看到路边一块里程碑,被雷电劈成两半,一半上刻着30,另一半刻着25。这时,卡普利加的脑际中忽然发现了一个绝妙的数学关系——

30+25=55 552=3025

把劈成两半的数加起来,再平方,正好是原来的数字。除此之外,还有没有别的数,也具有这样的性质呢?

熟悉速算的人很快就找到了另一个数:2025

20+25=45 452=2025

按照第一个发现者的名字,这种怪数被命名为“卡普利加数”,又称“雷劈数”。

现在已有许多办法搜寻这种数,但最简便的办法是在9与11的倍数中寻找。例如上面提到的55,它是11的倍数,45是9的倍数。用这种办法,人们果然找到了一个极其有趣的7777,不难验算:

77772=60481729 6048+1729=7777

前苏联的一个小朋友卡嘉也发现了一个新的“雷劈数”,它是9801。98+1=99,992=9801

从以上提到的4个“雷劈数”,我们不难发现同一情况:偶数+奇数=奇数,奇数的平方=奇数。3025,2025,9801和60481729都是奇数。那么,有没有偶数雷劈数存在呢?

答案是肯定的。7年以前,泸州师范附小的一位同学,就发现了偶数“雷劈数”:100,因为10+0=10,102=100,经过验证,100是最小的偶数雷劈数,也有可能它是唯一的偶数雷劈数。这位同学还发现了最小的奇数雷劈数:81,因为,8+1=9,92=81

可以推测:在数学王国里,数值最小的雷劈数只有1个,数值较大的雷劈数会有无数个存在,其中的奥秘还有待人们去不断探索。
2006-08-15 08:21 | 晓寒

# 不是雷劈数

abcd四位的数字,要求a>=b>=c>=d,而且不能全部相等,
用abcd-dcba得到的结果,表示成a1b1c1d1(如果不够4位就补零),然后再按照从大到小组织,再减去他的反转的数。这样循环下去,结果一定是6174
Kaprekar Routine: http://mathworld.wolfram.com/KaprekarRoutine.html
2006-08-15 08:38 | jzhang

# 这个Kaprekar number有两种解释...

呵呵,两个都叫Kaprekar number
2006-08-15 09:41 | jzhang

# 计算雷劈数的py程序

def check(n1,n2,bit):
if (n1 + n2)*(n1 + n2) == n1*(10**bit) + n2:
return True
else:
return False


if __name__ == "__main__":
for bit1 in range(1,7):
for n1 in range((10**(bit1-1)),(10**bit1) - 1):
for bit2 in range(1,7):
for n2 in range((10**bit2) - 1):
if check(n1,n2,bit2) == True:
str2 = str(n2)
while len(str2) < bit2:
str2 = "0"+str2
print n1,str2,"(",n1+n2,")is a K Number"

算两部分分别从1到7位的knumber, 算起来好慢...数学上有优化的可能么?
2006-08-15 09:45 | jzhang

# 是1-6位

rt
2006-08-15 09:47 | jzhang

# re: 一小段Python程序

寒寒:
1是不是雷劈数啊?
00+01=1 1^2=1
2006-08-18 22:49 | sjdev

# re: 一小段Python程序

还有0
0+0=0 0^2=0
2006-08-19 21:12 | sjdev

# re: 一小段Python程序

你的文章非常精彩,秀逗邀请您加入秀逗博客联盟.中国最大最专业的博客推荐联盟,秀逗博客联盟不截取流量,推荐后的文章指向作者本人的BLOG,文章24小时循环首页展示,真正意义上迅速提升你的博客流量!欢迎注册,注册后将推荐代码添加到自己的BLOG相应位置即可轻松推荐文章,让更多人分享你的文章!后期更有秀逗市场、同心琐秀、商业联盟以及社区陆续登场,更多娱乐功能、商业展示机会,完全免费使用,名人博客,不用再眼红,使用秀逗推荐,流量迅速上升,好的博客,秀逗为您宣传!地址:http://www.sodooo.com
2006-09-06 13:42 | sss
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]