`
shinfocom
  • 浏览: 1189419 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

以下代码可以转一个正整数为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的幂次方表达式转成数值。不是小数字,而是大数字。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics