求各位数字和为11且不含0的所有整数
excel吧
全部回复
仅看楼主
level 9
bengdeng 楼主
好久没来,今天在群里遇到一个很好的问题,又有人叫我吧主了,特意吧问题发到这里来,让大家试试手。
问题是这样的,求各位数字和为11且不含0的所有整数。
即如果这个数,他的各位数的数字之和为11,且各位数字中又没有0,即是解,列出所有的解。
大家可以用你自己的方法解出来,提示一下,解共1021个。[太开心]期待你能解出来,并附上你解决的方法。
2016年07月30日 09点07分 1
level 8
vba 看成11个1 从多到少开始取几个1 再加起来 除开10个1 这是我思路 不想去写代码[汗]
比如 1 1 1 1 1 1 1 1 1 1 1 取3个1 再取4个1 还剩4个1 这个数就是344
2016年07月30日 10点07分 3
我刚刚开始解决这个的时候也感觉很简单,循环嘛[哈哈]但编好后运行,结果计算量太大,卡死了好几次,重启了好几次Excel,最后还是优化了算法后,才解出来。
2016年07月30日 10点07分
@bengdeng 只是循环肯定不行 10位数要循环很久吧 我想到的就是找空格把这些1分开 1个空格2个空格最多10个空格
2016年07月30日 10点07分
level 10
MARK,没想到啥思路
2016年07月30日 10点07分 4
函数还是VBA的?
2016年07月30日 10点07分
@xzk235 只要你解得出,都可以
2016年07月30日 10点07分
level 10
If temp > Csum Then里增加了i = Left(i, j - 1) + 1 & String(Len(i) - j + 1, "1") - 1终于改善了速度,不加这句根本算不出来,直接卡死
Sub xxx()
Csum = 11
n = 0
Dim jg()
For i = 29 To 11111111115#
i = Replace(i, 0, 1)
temp = 0
For j = 1 To Len(i)
If Mid(i, j, 1) = "0" Then Exit For
temp = temp + Mid(i, j, 1)
If temp > Csum Then
i = Left(i, j - 1) + 1 & String(Len(i) - j + 1, "1") - 1
Exit For
End If
If temp = 11 And j = Len(i) Then
ReDim Preserve jg(n)
Debug.Print i
jg(n) = i
n = n + 1
End If
Next
Next
End Sub
2016年07月30日 14点07分 5
[大拇指]厉害!!
2016年07月31日 03点07分
用的是超级大循环啊。。。我觉得3楼的办法不错。。
2016年07月31日 06点07分
@Hoa小熊猫 带条件的循环,我自己运行1秒多,3楼那个暂时没想到好的实现方法。
2016年07月31日 06点07分
@Hoa小熊猫 是差不多0.53秒
2016年07月31日 06点07分
level 10
这个应该算是类似3楼的吧,用的递归,用时0.43-0.46秒的样子,跟5楼效率区别不大
Dim Count
Sub yyy()
t = Timer
jg = xxx(11)
Debug.Print Timer - t & "-" & Count
End Sub
Function xxx(n, Optional str = "")
For i = 1 To IIf(n < 9, n, 9)
If n = i Then
xxx = str & i
Debug.Print xxx
Count = Count + 1
Exit Function
Else
tstr = str & i
xxx n - i, tstr
End If
Next
End Function
2016年07月31日 06点07分 6
[大拇指]解2
2016年07月31日 07点07分
level 7
我似乎想到一个用二进制数模拟隔板有无的方法。。等会试试。。
2016年07月31日 07点07分 7
level 7
我的循环次数为1022*10次,测试可行,但因使用隔板法,结果不是按大小排序的:
2016年07月31日 09点07分 8
[真棒]很奇妙的解法,解3
2016年08月01日 04点08分
level 7
11个1之间共有10个位置,可任意放置1-10个隔板,如果把有隔板计为1,没有记为0,其实就是0000000001到1111111111之间的二进制数,共1023个,但需要去掉0000000001和1000000000,因为一个位置不能是10。于是剩下1021个,换成十进制,就是2-1023之间的数,去掉512。于是流程如下:
循环2-1023,不要512——转为10位的二进制——1的数量+1即是数字位数——循环1-10,还原出被1隔开的原数。
2016年07月31日 10点07分 9
1