求8的倍数的算法

Tomoyo 2008-10-28 01:36:51
我现在有a1,a2,a3,a4.......an个数它们的和为X,
现在要求如果X>800并且不是8的倍数的话,就在a1至an之中抽出最少个的方面,让X成为8的倍数
知道请告诉我
...全文
492 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tomoyo 2008-10-28
  • 打赏
  • 举报
回复
这个算法有一点点的漏洞.
比如an=7
an mod 8 =7
那找个 ay mod 8=1 的就 ax=1吧.
an+ax=8只要拿走这两个就可以了.
但是存在如果我拿走3和4这两个也可以.
这里3和4明显mod 8 不等于1
水如烟 2008-10-28
  • 打赏
  • 举报
回复
提示一下:
对n个数模8后,建一个类AInfo来保存.
Public Class AInfo
Public Count As Integer
Public Values As List(Of Integer)
End Class

然后用7个AInfo来存这些信息
Dim myInfos(6) As Ainfo
其中 myInfos(0)存模值为1,myInfos(6)存模值为7

将An分别模8存到对应的myInfos去

Dim m As Integer
For each [Value] As Integer In myInputs
m = [Value] Mod 8
If m > 0 Then
With MyInfos(m -1)
.Count+=1
.Values.Add([Value])
End With
End If
Next For
Tomoyo 2008-10-28
  • 打赏
  • 举报
回复
不用了,我开窍了.谢谢各位
Tomoyo 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lzmtw 的回复:]
如果
X MOD 8 =
0 那不用处理了
7 找An中模数为1的,只会是一个
6 An模为2的,有,就一个,没有,找两个模为1的,
其它类推广.
[/Quote]
我觉得这个算法可以.但是可以给出一个写代码的提示吗,这个规律想到我头痛
水如烟 2008-10-28
  • 打赏
  • 举报
回复
如果仅是对8,你也怕头疼的话,就作一个象13楼那样的表.
使用时判断摘取就是了.

这也难倒?
Tomoyo 2008-10-28
  • 打赏
  • 举报
回复
回13楼的,这个方面是可以,不过在写循环时代码不好实现吧
水如烟 2008-10-28
  • 打赏
  • 举报
回复
如果不是模8而是模108呢?
水如烟 2008-10-28
  • 打赏
  • 举报
回复
X MOD 8 = 7
1=1

X MOD 8 = 6
2=2
2=1+1

X MOD 8 = 5
3=3
3=2+1
3=1+1+1

X MOD 8 = 4
4=4
4=3+1
4=2+2
4=1+1+2
4=1+1+1+1

呵,你分析一下,然后打出规律.
满衣兄 2008-10-28
  • 打赏
  • 举报
回复
一时想不到什么简便的算法,想到的都有些复杂。
首先应该对a1,a2,a3,a4.......an从大到小排序。
水如烟 2008-10-28
  • 打赏
  • 举报
回复
8=1+7
8=2+6
8=2+5+1
8=2+4+2
...
8=1+1+1+1+1+1+1+1
李冬宝 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 Tomoyo 的帖子:]
我现在有a1,a2,a3,a4.......an个数它们的和为X,
现在要求如果X>800并且不是8的倍数的话,就在a1至an之中抽出最少个的方面,让X成为8的倍数
知道请告诉我
[/Quote]

就是说X>800 并且不是8的倍数,现在要取出最少个数,使X是8的倍数
取 X mod 8 = x
建立数组 b1,b2,b3....bn
使bn = an mod 8

循环找满足下面等式
2个数的循环
(bi+bj) mod 8 = x
3个数的循环
(bi+bj+bk) mod 8 = x

类似

可以优化一下
水如烟 2008-10-28
  • 打赏
  • 举报
回复
把n个数都mod 8, 值在0-7之间,是0的舍去,在1-7对应的那些数中匹配
gtiroy 2008-10-28
  • 打赏
  • 举报
回复
这个类似于闰年的算法,你可以参考一下
水如烟 2008-10-28
  • 打赏
  • 举报
回复
说了,两者都模8
水如烟 2008-10-28
  • 打赏
  • 举报
回复
An Mod 8
Tomoyo 2008-10-28
  • 打赏
  • 举报
回复
忘记说了,an<80
Tomoyo 2008-10-28
  • 打赏
  • 举报
回复
但是不一定会有 y= x MOD 8,在an中不一定会有y这个数,所以有可能会是y+(8*Z)
水如烟 2008-10-28
  • 打赏
  • 举报
回复
如果
X MOD 8 =
0 那不用处理了
7 找An中模数为1的,只会是一个
6 An模为2的,有,就一个,没有,找两个模为1的,
其它类推广.
水如烟 2008-10-28
  • 打赏
  • 举报
回复
我觉得MOD 8是关键,无论是对X还是对An
Tomoyo 2008-10-28
  • 打赏
  • 举报
回复
就在a1至an之中抽出最少个的方面
打错了,应该是
就在a1至an之中抽出最少个 个数的方法

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧