简单的算法..进来看看吧...

lzy5042 2003-05-26 10:59:37
把2的n次幂相加.得到一个值.
现在的问题是如何把这个 相加后得到的值在拆分成原来的值.
比如
2的0次幂+2的1次幂+2的2次幂+2的3次幂=1+2+4+8=15
现在有什么算法能把15拆分成1,2,4,8这样的形式?

谢谢..给高分.
...全文
56 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cy_nwau 2003-05-27
  • 打赏
  • 举报
回复
更简单的算法。
Private Sub Command1_Click()
Dim x&, i%, j%, n%, p&, y$
Do
x = InputBox("请输入一个大于零的整数")
Loop Until x > 0
Do Until x = 0
n = Int(Log(x) / Log(2))
p = 2 ^ n
y = p & "+" & y
x = x - p
Loop
MsgBox Left(y, Len(y) - 1)
End Sub

chao778899 2003-05-27
  • 打赏
  • 举报
回复
rewrite :
Private Function QiuMi(ByVal MM As Long) As Long
Dim Re As Long
Dim I As Long
Dim J As Long
Dim K As Long
I = MM
K = Log(MM) / Log(2)
J = 2 ^ K
If J > I Then
K = K - 1
J = 2 ^ K
End If
Re = J
QiuMi = Re



End Function
Private Sub Command3_Click()
Dim I As Integer
Dim J As Integer
Dim m As Long
Dim n As Long

Dim shu As Long
shu = CLng(Text1.Text)
m = QiuJin(shu)
Print m
n = shu - m
Do While n <> 0
m = QiuMi(n)
Print m
n = n - m
Loop
End Sub
blasterboy 2003-05-27
  • 打赏
  • 举报
回复
散分!!!!!
billyqiao 2003-05-27
  • 打赏
  • 举报
回复
ecivilian(抽象青年) ( ) 信誉:100 说的完全正确,这是计算机基础第一课的最基本的东西了:十进制和二进制之间的转换而已,很简单哦,没法解释了
rainstormmaster 2003-05-27
  • 打赏
  • 举报
回复
思路:用二进制运算判断某一位是否为1
程序:
Option Explicit

Private Function getbin(ByVal decnum As Long) As String
Dim i As Long
Dim j As Long
i = decnum
If i <= 0 Then
getbin = ""
Exit Function
End If
Dim k As Long, str As String
k = 0
str = ""
Do While j <= i
j = 2 ^ k
If (i And j) = j Then
str = "2^" + CStr(k) + "+" + str
End If
k = k + 1
Loop
str = Left(str, Len(str) - 1)
getbin = CStr(i) + "=" + str
End Function

Private Sub Command1_Click()
MsgBox getbin(511)
End Sub
lzy5042 2003-05-26
  • 打赏
  • 举报
回复
错了..


ecivilian(抽象青年) (
移位?如何处理?

koa3000(koa)
这只是二进制和十进制的转换哦.
LuZhanYuan 2003-05-26
  • 打赏
  • 举报
回复
以前好象哪里见过啊!
lzy5042 2003-05-26
  • 打赏
  • 举报
回复
楼上.不是这个意思哦.
是说把一个二进制的数字转换成2 的n次幂相加的形式..
如题.
ecivilian 2003-05-26
  • 打赏
  • 举报
回复
这不就是把十进制转成二进制吗?先用除模求余法,然后再将二进制数乘它的n(n位)次方。这些其实在二进制上用移位实现很方便的。
koa3000 2003-05-26
  • 打赏
  • 举报
回复
Option Explicit
Ptivate FunctiOn TenturnTwo (ByVal varNum As Long)
Dim returnString As String,ModNum As Integer
DO While varNum>0
ModNum=varNum Mod 2
varNum=varNum\2
returnString=Trim(Str (ModNum))+returnString
Loop
TenturnTwo=returnString
End Function
Private Function TwoturnTen (ByVal varString As String)
Dim Slen As Long,I As Long,
returnNum As Long
Slen=Len(varString)
For I=o To Slen-1
returmNum=returnNum +Val(Mid (varString,I+1,1))*(2^(Slen-I-1))
Next
TWoturnTen=returnNum
End Function
zhp80 2003-05-26
  • 打赏
  • 举报
回复
这是背包问题,具体算码忘了,找本书--尤其是关于安全的,多的是
lzy5042 2003-05-26
  • 打赏
  • 举报
回复
哦.错了.是2的8次幂+2的9次幂
lzy5042 2003-05-26
  • 打赏
  • 举报
回复
是啊.
现在我得到了比如1100000000这个二进制.
他是由256+512得到的.也就是2的5次幂+2的6次幂.
现在如何由1100000000得到256和512?

victorycyz 2003-05-26
  • 打赏
  • 举报
回复
不就是一个二进制嘛
cy_nwau 2003-05-26
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim x&, i%, j%, n%, p&, y$
x = InputBox("请输入一个整数")
n = Log(x) / Log(2)
y = ""
Do Until x = 0
p = 2 ^ n
If x - p >= 0 Then
y = p & "+" & y
x = x - p
End If
n = n - 1
Loop
MsgBox Left(y, Len(y) - 1)
End Sub
chao778899 2003-05-26
  • 打赏
  • 举报
回复
垃圾算法:如下:
Private Sub Command1_Click()
Dim m As Integer
Dim n As Integer
Dim shu As Integer
shu = CInt(Text1.Text)
m = QiuJin(shu)
If m <> -1 Then
n = shu - m
Print m
Else
Exit Sub
End If
Do While n <> 0
m = QiuJin(n)
If m <> -1 Then
n = n - m
Print m
Else
Exit Sub
End If
Loop
End Sub
Private Function QiuJin(ByVal QQ As Integer) As Integer
Dim Re As Integer
If QQ = 1 Then
Re = 1
ElseIf QQ >= 2 And QQ < 4 Then
Re = 2
ElseIf QQ >= 4 And QQ < 8 Then
Re = 4
ElseIf QQ >= 8 And QQ < 16 Then
Re = 8
ElseIf QQ >= 16 And QQ < 32 Then
Re = 16
ElseIf QQ >= 32 And QQ <= 64 Then
Re = 32
ElseIf QQ >= 64 And QQ < 128 Then
Re = 64
ElseIf QQ >= 128 And QQ < 256 Then
Re = 128
ElseIf QQ >= 256 And QQ < 512 Then
Re = 256
ElseIf QQ >= 512 And QQ < 1024 Then
Re = 512
ElseIf QQ >= 1024 And QQ < 2048 Then
Re = 1024
ElseIf QQ >= 2048 And QQ < 4096 Then
Re = 2048
ElseIf QQ >= 4096 And QQ < 8192 Then
Re = 4096
ElseIf QQ >= 8192 And QQ < 16384 Then
Re = 8192
ElseIf QQ >= 16384 And QQ < 32768 Then
Re = 16384
ElseIf QQ >= 32768 And QQ < 65536 Then
Re = 32768
Else
Re = -1
End If
QiuJin = Re

End Function


希望大家给初QIUJIN()函数的好算法
blasterboy 2003-05-26
  • 打赏
  • 举报
回复
选择判断一下就可以了,看到底哪个位上为1 ,比如地7位上为一,则就为2^(7-1) 亚,第N上为1 则为2^(N-1)不就可以了!
northwolves 2003-05-26
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
MsgBox crack(100000)
End Sub
Function crack(ByVal num As Long) As String
Dim dectobin As String, temp As Long, i As Long
dectobin = ""
temp = num
Do While Not temp = 1
dectobin = temp Mod 2 & dectobin
temp = temp \ 2
Loop
dectobin = "1" & dectobin
For i = 1 To Len(dectobin)
If Mid(dectobin, i, 1) = "1" Then crack = crack & " 2^" & (Len(dectobin) - i) & " +"
Next
crack = IIf(Right(crack, 1) = "+", Left(crack, Len(crack) - 1), crack)
crack = num & " = " & crack
End Function

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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