鱼C论坛

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

[作品展示] 排列组合运算器

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

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

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

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

  6. def combination(n, m):
  7.     """计算简单组合问题的函数"""
  8.     if check(n, m):
  9.         return 0
  10.     a=1
  11.     b=1
  12.     if m>n/2:
  13.         m=n-m
  14.     for i in range(1,m+1):
  15.         a *= n
  16.         b *= i
  17.         n -= 1
  18.     return a/b
  19.    
  20. def permutation(n, m):
  21.     """计算简单排列问题"""
  22.     if check(n, m):
  23.         return 0
  24.     a=1
  25.     for i in range(0, m):
  26.         a *= n
  27.         n -= 1
  28.     return a
  29.    
  30. def bind(n, m):
  31.     """捆绑法计算简单的问题"""
  32.     if check(n, m):
  33.         return 0
  34.     a=n-m+1
  35.     a=permutation(a, a)
  36.     b=permutation(m, m)
  37.     return a*b

  38. def interpolation(n, m):
  39.     """插空法计算简单的问题"""
  40.     if check(n, m):
  41.         return 0
  42.     a=permutation(n, n)
  43.     b=permutation(n+1, m)
  44.     return a*b
  45.    
  46. def plate_insert(n, m, same=True):
  47.     """插板法解决一般问题"""
  48.     if check(n, m):
  49.         return 0
  50.     if same:
  51.         return combination(n-1, m)
  52.     else :
  53.         a = permutation(n, n)
  54.         a *= permutation(n-1,m)
  55.     return a
  56.    
  57. def power(n, m):
  58.    """乘方运算"""       
  59.     a=1
  60.     for i in range(0, m):
  61.         a *= n
  62.     return a


  63. import easygui as g

  64. while 1:
  65.     choice = ("排列", "组合", "混合运算", "捆绑法", "插空法",\
  66.         "插板法")
  67.     yn=("继续", "退出")
  68.     msg = "请选择公式:"
  69.     title = "概率统计"
  70.     select = g.choicebox(msg, title, choice)
  71.     if select == "排列":
  72.         title += " —— " + select
  73.         while 1:
  74.             n=g.integerbox('请输入A的下标 n:',
  75.                 title, upperbound=999999999)
  76.             if n==None:
  77.                 break
  78.             m=g.integerbox('请输入A的上标 m:',
  79.                 title, upperbound=n)
  80.             if m==None:
  81.                 break
  82.             p=ps.permutation(n, m)
  83.             msg = "上标:m="+str(m)+\
  84.             "\n下标: n="+str(n)+\
  85.             "\n\n结果:"+str(p)
  86.             if g.ccbox(msg, title, yn) == False:
  87.                 break
  88.             
  89.     elif select == "组合":
  90.         title += " —— " + select
  91.         while 1:
  92.             n=g.integerbox('请输入C的下标 n:',
  93.                 title, upperbound=999999999)
  94.             if n==None:
  95.                 break
  96.             m=g.integerbox('请输入C的上标 m:',
  97.                 title, upperbound=n)
  98.             if m==None:
  99.                 break
  100.             p=ps.combination(n, m)
  101.             msg = "上标:m="+str(m)+\
  102.             "\n下标: n="+str(n)+\
  103.             "\n\n结果:"+str(p)
  104.             if g.ccbox(msg, title, yn) == False:
  105.                 break
  106.     elif select == "捆绑法":
  107.         title += " —— " + select
  108.         while 1:
  109.             n=g.integerbox('请输入总数 n:',
  110.                 title, upperbound=999999999)
  111.             if n==None:
  112.                 break
  113.             m=g.integerbox('请输入捆绑个数 m:',
  114.                 title, upperbound=n)
  115.             if m==None:
  116.                 break
  117.             p=ps.bind(n, m)
  118.             msg = "捆绑数:m="+str(m)+\
  119.             "\n总数: n="+str(n)+\
  120.             "\n\n结果:"+str(p)
  121.             if g.ccbox(msg, title, yn) == False:
  122.                 break
  123.             
  124.     elif select == "插空法":
  125.         title += " —— " + select
  126.         while 1:
  127.             n=g.integerbox('请输入被插空者数 n:',
  128.                 title, upperbound=999999999)
  129.             if n==None:
  130.                 break
  131.             m=g.integerbox('请输入插空者数 m:',
  132.                 title, upperbound=n)
  133.             if m==None:
  134.                 break
  135.             p=ps.interpolation(n, m)
  136.             msg = "插空者:m="+str(m)+\
  137.             "\n被插空者: n="+str(n)+\
  138.             "\n\n结果:"+str(p)
  139.             if g.ccbox(msg, title, yn) == False:
  140.                 break
  141.                
  142.     elif select == "插板法":
  143.         title += " —— " + select
  144.         while 1:
  145.             n=g.integerbox('请输入被插板者数 n:',
  146.                 title, upperbound=999999999)
  147.             if n==None:
  148.                 break
  149.             m=g.integerbox('请输入插板数 m:',
  150.                 title, upperbound=n)
  151.             if m==None:
  152.                 break
  153.             p=ps.plate_insert(n, m)
  154.             msg = "插板数:m="+str(m)+\
  155.             "\n被插板者: n="+str(n)+\
  156.             "\n\n结果:"+str(p)
  157.             if g.ccbox(msg, title, yn) == False:
  158.                 break
  159.                
  160.     elif select == "混合运算":
  161.         title += " —— " + select
  162.         a=1
  163.         symbol=[chr(0x00d7)]
  164.         number = []
  165.         method = []
  166.         index=0
  167.         while 1:
  168.             msg="请选择运算方法:"
  169.             choice=("排列", "组合", "数","乘方")
  170.             choice=g.buttonbox(msg, title, choice)
  171.             
  172.             if choice == "排列":
  173.                 n=g.integerbox('请输入A的下标 n:',
  174.                     title, upperbound=999999999)
  175.                 if n==None:
  176.                     continue
  177.                 m=g.integerbox('请输入A的上标 m:',
  178.                     title, upperbound=n)
  179.                 if m==None:
  180.                     continue
  181.                 b=ps.permutation(n, m)
  182.                 number.append((n,m))
  183.                 method.append(choice)
  184.             elif choice == "组合":
  185.                 n=g.integerbox('请输入C的下标 n:',
  186.                     title, upperbound=999999999)
  187.                 if n==None:
  188.                     continue
  189.                 m=g.integerbox('请输入C的上标 m:',
  190.                     title, upperbound=n)
  191.                 if m==None:
  192.                     continue
  193.                 b=ps.combination(n, m)
  194.                 number.append((n,m))
  195.                 method.append(choice)
  196.                
  197.             elif choice == "乘方":
  198.                 n=float(g.enterbox('请输入底数  n:',
  199.                     title))
  200.                 if n==None:
  201.                     continue
  202.                 m=int(g.enterbox('请输入指数 m:',
  203.                     title))
  204.                 if m==None:
  205.                     continue
  206.                 b=ps.power(n, m)
  207.                 number.append((n,m))
  208.                 method.append(choice)
  209.             else:
  210.                 b=float(g.enterbox("请输入数字 b:",\
  211.                     title, ))
  212.                 if b==None:
  213.                     continue
  214.                 number.append(b)
  215.                 method.append(choice)
  216.             
  217.             msg = "请选择运算符号:"
  218.             choice=("+", "-", chr(0x00d7), chr(0xf7), "=")
  219.             choice=g.buttonbox(msg, title, choice)
  220.             symbol.append(choice)
  221.             if symbol[index]=='+':
  222.                 a += b
  223.             elif symbol[index]=='-':
  224.                 a -= b
  225.             elif symbol[index]==chr(0x00d7):
  226.                 a *= b
  227.             elif symbol[index]==chr(0xf7):
  228.                 a /= b
  229.             index += 1
  230.             if symbol[index]=='=':
  231.                 index=0
  232.                 msg = ""
  233.                 while 1:
  234.                     if method[index]=="组合":
  235.                         msg += "C"
  236.                     elif method[index]=="排列":
  237.                         msg += "A"
  238.                     elif method[index]=="乘方":
  239.                         msg += "P"
  240.                     msg += str(number[index])
  241.                     index += 1
  242.                     msg += symbol[index]
  243.                     if  symbol[index]=='=':
  244.                         break
  245.                 msg += '\n结果:' + str(a)
  246.             
  247.                 if g.ccbox(msg, title, yn) == False:
  248.                     break
  249.                
  250.     else:
  251.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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