鱼C论坛

 找回密码
 立即注册
查看: 1386|回复: 0

[原创] 排列组合运算器

[复制链接]
发表于 2019-10-7 22:49:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def check(n,m):
    if n<m:
        print("上标不能大于下标!")
        return 1
    return 0

def combination(n, m):
    """计算简单组合问题的函数"""
    if check(n, m):
        return 0
    a=1
    b=1
    if m>n/2:
        m=n-m
    for i in range(1,m+1):
        a *= n
        b *= i
        n -= 1
    return a/b
    
def permutation(n, m):
    """计算简单排列问题"""
    if check(n, m):
        return 0 
    a=1
    for i in range(0, m):
        a *= n
        n -= 1
    return a
    
def bind(n, m):
    """捆绑法计算简单的问题"""
    if check(n, m):
        return 0 
    a=n-m+1
    a=permutation(a, a)
    b=permutation(m, m)
    return a*b

def interpolation(n, m):
    """插空法计算简单的问题"""
    if check(n, m):
        return 0 
    a=permutation(n, n)
    b=permutation(n+1, m)
    return a*b
    
def plate_insert(n, m, same=True):
    """插板法解决一般问题"""
    if check(n, m):
        return 0 
    if same:
        return combination(n-1, m)
    else :
        a = permutation(n, n)
        a *= permutation(n-1,m)
    return a
    
def power(n, m):
   """乘方运算"""        
    a=1
    for i in range(0, m):
        a *= n
    return a


import easygui as g

while 1:
    choice = ("排列", "组合", "混合运算", "捆绑法", "插空法",\
        "插板法")
    yn=("继续", "退出")
    msg = "请选择公式:"
    title = "概率统计"
    select = g.choicebox(msg, title, choice)
    if select == "排列":
        title += " —— " + select 
        while 1:
            n=g.integerbox('请输入A的下标 n:', 
                title, upperbound=999999999)
            if n==None:
                break
            m=g.integerbox('请输入A的上标 m:',
                title, upperbound=n)
            if m==None:
                break
            p=ps.permutation(n, m)
            msg = "上标:m="+str(m)+\
            "\n下标: n="+str(n)+\
            "\n\n结果:"+str(p) 
            if g.ccbox(msg, title, yn) == False:
                break
            
    elif select == "组合":
        title += " —— " + select 
        while 1:
            n=g.integerbox('请输入C的下标 n:', 
                title, upperbound=999999999)
            if n==None:
                break
            m=g.integerbox('请输入C的上标 m:',
                title, upperbound=n)
            if m==None:
                break
            p=ps.combination(n, m)
            msg = "上标:m="+str(m)+\
            "\n下标: n="+str(n)+\
            "\n\n结果:"+str(p) 
            if g.ccbox(msg, title, yn) == False:
                break
    elif select == "捆绑法":
        title += " —— " + select 
        while 1:
            n=g.integerbox('请输入总数 n:', 
                title, upperbound=999999999)
            if n==None:
                break
            m=g.integerbox('请输入捆绑个数 m:',
                title, upperbound=n)
            if m==None:
                break
            p=ps.bind(n, m)
            msg = "捆绑数:m="+str(m)+\
            "\n总数: n="+str(n)+\
            "\n\n结果:"+str(p) 
            if g.ccbox(msg, title, yn) == False:
                break
            
    elif select == "插空法":
        title += " —— " + select 
        while 1:
            n=g.integerbox('请输入被插空者数 n:', 
                title, upperbound=999999999)
            if n==None:
                break
            m=g.integerbox('请输入插空者数 m:',
                title, upperbound=n)
            if m==None:
                break
            p=ps.interpolation(n, m)
            msg = "插空者:m="+str(m)+\
            "\n被插空者: n="+str(n)+\
            "\n\n结果:"+str(p) 
            if g.ccbox(msg, title, yn) == False:
                break
                
    elif select == "插板法":
        title += " —— " + select 
        while 1:
            n=g.integerbox('请输入被插板者数 n:', 
                title, upperbound=999999999)
            if n==None:
                break
            m=g.integerbox('请输入插板数 m:',
                title, upperbound=n)
            if m==None:
                break
            p=ps.plate_insert(n, m)
            msg = "插板数:m="+str(m)+\
            "\n被插板者: n="+str(n)+\
            "\n\n结果:"+str(p) 
            if g.ccbox(msg, title, yn) == False:
                break
                
    elif select == "混合运算":
        title += " —— " + select 
        a=1
        symbol=[chr(0x00d7)]
        number = []
        method = []
        index=0
        while 1:
            msg="请选择运算方法:"
            choice=("排列", "组合", "数","乘方")
            choice=g.buttonbox(msg, title, choice)
            
            if choice == "排列":
                n=g.integerbox('请输入A的下标 n:', 
                    title, upperbound=999999999)
                if n==None:
                    continue
                m=g.integerbox('请输入A的上标 m:',
                    title, upperbound=n)
                if m==None:
                    continue
                b=ps.permutation(n, m)
                number.append((n,m))
                method.append(choice)
            elif choice == "组合":
                n=g.integerbox('请输入C的下标 n:', 
                    title, upperbound=999999999)
                if n==None:
                    continue
                m=g.integerbox('请输入C的上标 m:',
                    title, upperbound=n)
                if m==None:
                    continue
                b=ps.combination(n, m)
                number.append((n,m))
                method.append(choice)
                
            elif choice == "乘方":
                n=float(g.enterbox('请输入底数  n:', 
                    title))
                if n==None:
                    continue
                m=int(g.enterbox('请输入指数 m:',
                    title))
                if m==None:
                    continue
                b=ps.power(n, m)
                number.append((n,m))
                method.append(choice)
            else:
                b=float(g.enterbox("请输入数字 b:",\
                    title, ))
                if b==None:
                    continue
                number.append(b)
                method.append(choice)
            
            msg = "请选择运算符号:"
            choice=("+", "-", chr(0x00d7), chr(0xf7), "=")
            choice=g.buttonbox(msg, title, choice)
            symbol.append(choice)
            if symbol[index]=='+':
                a += b
            elif symbol[index]=='-':
                a -= b
            elif symbol[index]==chr(0x00d7):
                a *= b
            elif symbol[index]==chr(0xf7):
                a /= b
            index += 1
            if symbol[index]=='=':
                index=0
                msg = ""
                while 1:
                    if method[index]=="组合":
                        msg += "C"
                    elif method[index]=="排列":
                        msg += "A"
                    elif method[index]=="乘方":
                        msg += "P"
                    msg += str(number[index])
                    index += 1
                    msg += symbol[index]
                    if  symbol[index]=='=':
                        break
                msg += '\n结果:' + str(a)
            
                if g.ccbox(msg, title, yn) == False:
                    break
                
    else:
        break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表