jmyhyu
发表于 2010-4-30 18:33:41
递归即可,我以前写过一个VB代码:http://blog.csdn.net/northwolves/archive/2007/12/03/1912809.aspx
northwolves 发表于 2010-4-24 23:42 http://bbs.emath.ac.cn/images/common/back.gif
写代码的话就简单多了
但是纯数学方法。。。
wayne
发表于 2019-10-10 08:32:16
效率最高的代码:
Select], Length] == 6 &]
chyanog
发表于 2019-10-10 21:11:44
如果问题改成从1-33中任取10个数使和为102,用IntegerPartitions速度也不够快了
Select],DuplicateFreeQ]//Length//AbsoluteTiming
Compile[{},Sum,{a,5},{b,a+1,(66-a)/9},{c,b+1,1/8 (74-a-b)},{d,c+1,1/7 (81-a-b-c)},{e,d+1,1/6 (87-a-b-c-d)},{f,e+1,1/5 (92-a-b-c-d-e)},{g,f+1,1/4 (96-a-b-c-d-e-f)},{h,g+1,1/3 (99-a-b-c-d-e-f-g)},{i,h+1,1/2 (101-a-b-c-d-e-f-g-h)}]][]//AbsoluteTiming
第二种方法如果能写成递归会简洁一些
markfang2050
发表于 2019-10-18 22:57:10
# !/usr/bin/env python3.6.4
# -*- coding: utf-8 -*-
# @Author:Nicolas TU
# @Date: 2019-10-18 20:57:07
#从1-33中,任取6个不同的数,要求和为102,共有几种取法?
#ANS:20076
import time
time_start=time.time()#计算时间开始
j=0;
for a in range(1,33+1):# 迭代 1 到 33之间的数.假设a>=b>=c>=d>=e>=f,避免重复问题;
for b in range(1,a+1):
for c in range(1,b+1):
for d in range(1,c+1):
for e in range(1,d+1):
for f in range(1,e+1):
# 逻辑关系
if a+b+c+d+e+f==102and\
a!=b and a!=c and a!=d and a!=e and a!=f and\
b!=c and b!=d and b!=e and b!=f and\
c!=d and c!=e and c!=fand\
d!=e and d!=f and\
e!=f :#也可用列表来去重,len(set(list))==6;
j += 1 # 统计解的个数
#print('-'*60)
#print ('第%d组解为:%d,%d,%d,%d,%d,%d\n.' % (j,a,b,c,d,e,f))
time_end=time.time()#计算时间结束
print('-'*60)
print ('总计存在%d组解。' %j)
print('-'*60)
print('python3.6程序运行',time_end-time_start,'秒。')
print('-'*60)
'''
------------------------------------------------------------
总计存在20076组解。
------------------------------------------------------------
python3.6程序运行 1.4291820526123047 秒。
------------------------------------------------------------'''
'''
.·.·.
发表于 2019-10-19 08:43:42
markfang2050 发表于 2019-10-18 22:57
# !/usr/bin/env python3.6.4
# -*- coding: utf-8 -*-
# @Author:Nicolas TU
或许你应该跟Mathematica比一比速度……
markfang2050
发表于 2019-10-19 20:47:40
.·.·. 发表于 2019-10-19 08:43
或许你应该跟Mathematica比一比速度……
不比。么有可比性。MMA效率高。