趣味百题之趣味变幻

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 17 15:01:35 2017


@author: alis
趣味变幻
"""


#1.将一个正整数分解质因数。例如,输入90,打印出90=2*3*3*5


def fun1(n):
    Z = n
    res = []
    k=2
    while k<=n:
        if  (n%k) == 0:
            res.append(k)
            n = n/k            
        else:
            k = k +1          
    # 打印        
    Str = ""
    for i in res:
        Str = Str  + str(i)


    temp = "*".join(Str)
    print "%d = "%Z + temp
     
fun1(90)      












#2.A代表数字0~9中的前5个数字,Z代表后5个数字,请还原下列乘式:aza*aaz=zazaa




'''
*问题分析与算法设计


  问题本身并不复杂,可以对乘式中的每一位使用穷举法,最终可以得到结果。
  本题的关键在于怎样有效的判断每个部分积的每一位是否满足题意,这一问题处理不好,
  编写的程序会很长。程序实现中采用了一个判断函数,
  通过传入函数的标志字符串对所有的数进行统一的判断处理。'''
  # 372 *246
  
  
#3.给定下列除式,其中包含5个7,其他打X的是任意数字,请加以还原。


for i in range(1,10):
    for j in range(1,10):
        for k in range(1,10):
            a = 10*i + j
            temp = a * k
            if temp%100 == 77:
                if ((a*7)%100)/10 == 7:
                    print i,j,k
  
  # 除数为53,被除数为51403,商为971
  
 # 4.
'''在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,
  具有这种性质的图表,称为“幻方”。我国古代称为“河图”、“洛书”,又叫“纵横图”。'''
  


def fun(n):
    m = [[0] * n for i in xrange(n)]


    x, y = 0, n / 2
    m[x][y] = 1


    for k in xrange(2, n * n + 1):
        if x == 0 and y == n - 1:
            x1, y1 = x + 1, y
        elif x == 0:
            x1, y1 = n - 1, y + 1
        elif y == n - 1:
            x1, y1 = x - 1, 0
        else:
            x1, y1 = x - 1, y + 1


        x, y = (x + 1, y) if m[x1][y1] else (x1, y1)
        m[x][y] = k


    return m


fun(8)  










#5.
'''有一个12品脱(pint)的酒瓶,里面装满葡萄酒,另有8品脱和5品脱的瓶子各一个。问如何从中分出6品脱的酒出来?
传说泊松年轻时成功解决了该问题,勾起了他对数学的兴趣而投身数学研究,
因此该问题被称为泊松分酒问题。另外这个问题又被称为分油问题、分水问题等。'''






# 思路规则
#1. 大瓶子只能倒入中瓶子


#2. 中瓶子只能倒入小瓶子


#3. 小瓶子只能倒入大瓶子


#4. 小瓶子只有在已经装满的情况下才能倒入大瓶子


#5. 若小瓶子被倒空,则无论中瓶子是否满,应马上从中瓶子倒入小瓶子




L = [12, 8, 5]
l = [12, 0, 0]
c = [lambda: l[1] == 0, lambda: l[1] != 0, lambda: l[2] == L[2]]


src = 0
while 6 not in l:
    dst = (src + 1) % 3
    if c[src]():
        t = min(L[dst] - l[dst], l[src])
        l[src] -= t
        l[dst] += t
        print l
    src = dst    
    
    
# 6. 某人有4张3分的邮票和3张5分的邮票,用这些邮票中的一张或若干张可以得到多少种不同的邮资?




L = []
for i in range(5):
    for j in range(4):
        a = 3*i + 5*j
        if a>0:L.append(a)      
print len(L)        
  
len({3 * x + 5 * y for x in xrange(4 + 1) for y in xrange(3 + 1) if x + y > 0})
        




#7.将一个正整数拆分成若干个正整数的和,问有多少种分法。


d = {}


def fun(n, m):
    if (n, m) in d:
        return d[(n, m)]
    if m > n: m = n
    res = 1
    for i in xrange(m, 1, -1):
        res += fun(n - i, i)
    d[(n, m)] = res
    return res


print fun(5,2)            














































      

你可能感兴趣的:(趣味算法)