python 练习 4

#!/usr/bin/python
# -*- coding: utf-8 -*-
from math import sqrt
import random
def daoxu(n):
   d=n
   s=0
   while d!=0:
      d,f=divmod(d,10)
      s=f+s*10
   return s
def z85():
    #任意取一个十进制数如123,然后他和他的回文数321相加,得到新整数后重复以上步骤,最后
    #可以得到一个回文数444
    s1=179233126
    s2=0
    while s2!=s1:
        s1=s1+s2
        s2=daoxu(s1)
        print s2
    return
def z81():
    '''角谷猜想是任何一个数如果是偶数就除以2如果是奇数就乘以3再加1,最后会导致1,4,2,循环'''
    x=123347
    while x!=1:
        x= x%2==0 and x/2 or (x*3+1)/2
        print x
def fangf(x):
    t=int(sqrt(x))
    if t*t==x: return [t]
    t=int(sqrt(x-1))+1
    m=range(t)
    for i in m:
        for j in m:
            for k in range(j,t):
                for p in range(k,t):
                    if i *i + j * j + k * k + p * p == x:
                        if i==0 and j==0:return[k,p]
                        if i==0 and j!=0:return[j,k,p]
                        return [i,j,k,p]
def z82():
    #所有自然数最多可以用四个自然数的平方表示,验证这个定理
    for i in range(2,100):
        print i,fangf(i)
def z83():
    # 任意一个四位数,如1324,可以得到数1234和4321,然后4321-1234得到新数,重复以上步骤,
    #最后得到6174。而7641-1467=6174
    def six(x):
        t=1
        e=list(str(x))
        e.sort()
        e=''.join(e)
        n=int(e)
        if n<1000:t=10
        return daoxu(n)*t-n
    i=1999
    print i
    while i!=6174:
        i=six(i)
        print i
def z84():
    '''证明任何一个数a的立方等于一串连续奇数的和,其中首项为(a*(a-1)+1),公差为2,共a项
    他们的和是((a*(a-1)+1)*a+(2*a-2)*a/2=(a^3-a^2+a)+(a^2-a)=a^3
'''
    print "任何一个数a的立方等于一串连续奇数的和"
    return
def z80():
    '''很容易证明的定理大于1000的奇数x有x*x-1是8的倍数
    [1,3,5,7]=[1,1,1,1]
'''
    t=[i*i%8 for i in range(1,8,2)]
    print t
    print "大于1000的奇数x有x*x-1是8的倍数"
    return
def z78():
    #用正多边形逼近的方法计算pi
    x1=100000
    b,i=0.5,6
    while i<x1:
        b=sqrt(2-2*sqrt(1-b*b))/2
        i*=2
    print b*i
def z79():
    '''随机法计算pi:
本程序并不使用计算pi值的算法,它只是一个概
率模拟,即在边长为100的正方形内随机产生多
个点,将点以圆弧为界分开统计,由于点的个数
很多,直至几乎布满整个区域。此时,点的个数
就可以看作就是它所在区域的面积。可以得到如
下推导:

(1)蓝色区内点个数:总个数≈蓝色面积:总面积

(2)蓝色区内点个数:总个数≈圆面积/4:总面积

(3)蓝色区内点个数:总个数≈π×200×200/4:200×200

(4)π≈ 4×蓝色区内点个数/总个数

  当然,点的位置会重复,所以结果与π值是
有差别的,不过,当点足够多时,可以看到一个
非常接近的结果。'''
    x,y,z=0,100000,0
    g=random.random
    while x<y:
        a=g()
        b=g()
        if a*a+b*b<1:
            z+=1
        x+=1
    print 4.0*z/y
if __name__ == '__main__':
    s=""
    for i in range(78,86):
        s+='z'+str(i)+'()\n'
    exec(s)
   

 

posted @ 2016-05-23 23:45  七月的尾巴_葵花  阅读(292)  评论(0编辑  收藏  举报