用Coldfusion实现:任何一个正整数都可以用2的幂次方表示式

本文提供了一段代码,用于将大正整数转换为2的幂次方之和的形式,并对过程进行了说明。该方法适用于处理较大数值的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码可以转一个正整数为2的幂次方表达式。没什么严谨验证,只是简单检验一下。

 

<cffunction name="makeup">
     <cfargument name="mylist" default="">
     <cfset var l_key = "">
     <cfset var l_key2 = "">
     <cfset var l_counter = "">
     <cfloop list="#mylist#" delimiters="+" index="l_key">
             <cfset l_counter = listvaluecount(mylist, l_key, "+")>
             <cfif l_counter gt 1>
                    <cfloop from="1" to="#l_counter-(l_counter mod 2)#" index="l_key2">
                               <cfset mylist = listdeleteat(mylist, listfind(mylist, l_key, "+"), "+")>
                               <cfif l_key2 mod 2 eq 0>
                                      <cfset mylist = listappend(mylist, l_key-1,"+")>
                                </cfif>
                   </cfloop>
                   <cfset mylist = makeup(mylist)>
                   <cfbreak>
            </cfif>
     <cfloop>
     <cfreturn mylist>
</cffunction>

 

 

<cfset a = "123456"> <!--- 要转换的正整数 --->
<cfset a1 = a>
<cfset c = "">
<cfset d = arraynew(1)>
<cfloop from="1" to="#ceiling(len(a)/15)#" index="l_key">
          <cfset d[l_key] = mid(a, (l_key-1)*15+1,15)>
</cfloop>

<cfloop from="1" to="#arraylen(d)#" index="l_key">
      <cfset e=  0>
      <cfloop from="#l_key+1#" to="#arraylen(d)#" index="l_key2">
            <cfset e = e+len(d[l_key2])>
      </cfloop>
      <cfset a = d[l_key] & repeatstring("0", e)>
      <cfloop condition="a gt 0">
              <cfset b = int(log(a)/log(2))>
              <cfset a = a - 2^b>
              <cfset c = listappend(c, "2^#b#","+")>
       </cfloop>
</cfloop>

 

<cfset c = replace(c, "2^", "-", "all")>
<cfset c = makeup(c)>
<cfset c=  listsort(c, "numeric", "asc", "+")>
<cfset c = replace(c, "-", "2^", "all")>
<cfif listlast(c,"+") eq "0">
       <cfset c = listdeleteat(c, listfind(c, "0","+"),"+")>
       <cfset c = listappend(c, "2^0","+")> 
</cfif>


<cfoutput>
Original: #a#<br>
Output: #c#
</cfoutput>

 

请测试一下。不知道如何逆转。实现把2的幂次方表达式转成数值。不是小数字,而是大数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值