由1,2,4,8,16...相加组成的数,如何快速确定组合数

yyoinge 2011-06-18 04:34:17
有一个long型数据,它可能由1,2,4,8,16...等数相加组成,如何用最少的循环次数确认出它由哪几个数组成?

如:9 由 1、8 组成(如何通过两次循环得出结论来:2^0 + 2^3 , 最终结果包含0 和 3)
又如:521 由 1、8、512 组成(如何通过三次循环得出结论来:2^0 + 2^3 + 2^9, 最终结果包含0 、 3 和 9)
...全文
322 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyoinge 2011-06-18
  • 打赏
  • 举报
回复
转换成2进制需要循环四次才能得出结果来,如果这个数再大一点了,如果是2^31次方,那么你要先转换成2进制就得循环31次才能得到结果,但是当这个数等于2^31次方时,我想要的是只用一次循环就求出结果为31来
zjxsw 2011-06-18
  • 打赏
  • 举报
回复
转换成2进制不就知道了 9 = 1001
yyoinge 2011-06-18
  • 打赏
  • 举报
回复
根据上面的思路,可以使用以下(不需要循环)方法来判断一个数是不是另外一个数的组成树,如判断 1 是521的组成数
long ll_in = 1, ll_all = 521

dec ld
ld = log(ll_in) / log(2)
if int(ld) <> ld then return false //ll_in都已经不是2的N次方数了,肯定不是组成ll_all的数
long n, m
m = ll_in + int(ll_all / (ll_in * 2)) * (2 * ll_in)
if ll_all >= m and al_all < m + al_in then return true
return false
yyoinge 2011-06-18
  • 打赏
  • 举报
回复
没人回答吗,自己想出来了

long ll = 521
dec ld
int li
if ll > 0 then
do while true
ld = log(ll) / log(2)
li = int(li)//li就是我要求胡数字
if li = ld then exit
ll -= 2^li
loop
end if

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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