用MSSQL计算2的10000次方

原创 2011年01月12日 10:44:00

在论坛看到 牛人们的 思路  特此收藏啊  以备学习

----------本机测试 1秒---------

用decimal(38,0),0秒:

 

SET NOCOUNT ON

 

GO

IF OBJECT_ID('BASED') IS NOT NULL DROP TABLE BASED

IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB

GO

CREATE TABLE BASED(ID INT PRIMARY KEY,VAL BIGINT)

INSERT INTO BASED SELECT 0,1 union all

SELECT id,power(convert(decimal(38,0),2),id) FROM(

select number as id from master..spt_values where type='p' and number>0 and number<57

)T

insert into BASED select number+57,power(convert(decimal(38,0),2),56)*power(2,number+1) from master..spt_values where type='p' and number<4

--以上求出2^1~2^60,因power函数在2^56以上时有舍去位,故分两步处理,以乘法代之

DECLARE @I INT ,@COUNT INT,@RESULT VARCHAR(MAX),@P60 decimal(38,0),@Pleft decimal(38,0)

SELECT @I=1,@RESULT='',@COUNT=10000    --@COUNT=10000就是计算2的10000次方

select @P60=val from BASED where id=60

select @Pleft=val from BASED where id=@count % 60

 

CREATE TABLE TB(ID INT PRIMARY KEY,VAL decimal(38,0))

INSERT INTO TB SELECT 1,1

INSERT INTO TB

SELECT number,0 FROM(

select number from master..spt_values where type='p' and number>1 and number<=@count/60+2

)T

--设总行数为 @count/60+2

 

WHILE @I<=@COUNT/60

BEGIN

    UPDATE T1 SET T1.VAL= (T1.VAL*@P60+floor((isnull(T2.VAL,0)*@P60+floor(isnull(t3.val,0)*@P60/10000000000000000000))/10000000000000000000))%10000000000000000000

    FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1

    SET @I=@I+1

END

-- @count/60 次 @P60 相乘

 

UPDATE T1 SET T1.VAL= (T1.VAL*@Pleft+floor((isnull(T2.VAL,0)*@Pleft+floor(isnull(t3.val,0)*@Pleft/10000000000000000000))/10000000000000000000))%10000000000000000000

FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1

--乘以剩下的 2^(@count % 60)

 

SELECT @RESULT=@RESULT+right('000000000000'+CONVERT(VARCHAR(19),VAL),19) FROM TB

WHERE VAL>0

ORDER BY ID DESC

--SELECT @RESULT=CONVERT(VARCHAR(10),VAL)+@RESULT FROM TB

--WHERE  and id=@count/30+2

 

SELECT right(@RESULT,LEN(@RESULT)-PATINDEX('%[1-9]%',@RESULT)+1)

SET NOCOUNT OFF

/*

 

199506311688075838488374216268358508382349683188619245

.....

*/

 

 

每次运算都*2^30,最后一次补足10000,循环数量变为原来的1/30了,而且每次的运算都是由系统进行,比进位运算要快很多,肯定是顺间出来的。

---------------本机22秒

 

A的B次方 

 

 

create FUNCTION [dbo].[powerX](@loopnumber bigint,@loopcount int)

RETURNS varchar(max)

AS

BEGIN

 

declare @str varchar(max)

declare @loop int

declare @len int

declare @num bigint

declare @add int

declare @output varchar(max)

 

set @str=cast(@loopnumber as varchar(max))

set @loop=1

 

while (@loop<@loopcount)

begin

    set @output=''

    set @add=0

    set @len=len(@str)

        while (@len!=0)

        begin

            set @num = cast(substring(@str,@len,1) as int)

            set @num=@num*@loopnumber+@add

            set @add=@num/10

            set @output=cast(@num%10 as varchar(max))  +@output

            set @len=@len-1

        end

        if(@add>=1)

            begin

        set @output = cast(@add as varchar(max))+@output

            end

 set @loop=@loop+1

 set @str=@output

end

return @str

end

 

declare @val bigint

select @val=cast(dbo.powerX(2,25)as bigint)

select dbo.powerX(@val,400)

-------------------

 

 

详情 见论坛 :

http://topic.csdn.net/u/20110108/18/c4d2e6e0-ee57-4f6b-84e4-51dab792fa1f.html

用MSSQL计算2的10000次方

用MSSQL计算2的10000次方 论坛牛人之。。。。。。
  • sage425
  • sage425
  • 2011年01月12日 10:41
  • 663

Python计算2的38次幂

#!/usr/bin/python #filename:1.py print (reduce(lambda x,y:x*y,[2 for x in xrange(38)])) print(reduce...
  • u013161399
  • u013161399
  • 2014年10月23日 20:16
  • 1861

C/C++ 编程计算2的100万次方(m的n次方),超长结果输出文件

C/C++ 编程计算2的100万次方(m的n次方),超长结果输出文件
  • w442863748
  • w442863748
  • 2016年03月25日 10:30
  • 2035

ACM 2的N次方

题目要求 总时间限制:1000ms内存限制:65536kB 描述 任意给定一个正整数N(N 输入输入一个正整数N。输出输出2的N次方的值。提示高精度计算初看这道题时感觉很简单,大脑一根筋的直接一个循环...
  • Little_person
  • Little_person
  • 2016年05月21日 14:07
  • 2181

一个关于2的n次方的代码(C++)

  /*---------------------------- ×××求2的n次方的程序××× ----------------------------*/#include #incl...
  • foliage_
  • foliage_
  • 2008年07月30日 21:49
  • 1552

C++递归算法之2的幂次方表示

2的幂次方表示: 任何一个正整数都可以用2的幂次方表示。例如:     137=27+23+20 同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:   ...
  • C20190413
  • C20190413
  • 2017年05月22日 13:43
  • 1499

2的次幂 -- 程序员大数计算必备

最近做IPV6,需要将IPV6转换成一个大数,方便操作。因为ipv6格式是128位,传统处理方式已经不起作用,只要找来大数运算的东东,贴出2的1000以内次幂的值,大家可以参考。...
  • timebomb
  • timebomb
  • 2013年11月27日 09:27
  • 7523

移位实现除法(除数不是2的幂次方)

#include #include int Division(int y,int x) { int sum=0; int i=0; while(y>x)//向左移位直到x>=y { ...
  • avrmcu1
  • avrmcu1
  • 2014年09月06日 09:08
  • 423

Swift - 计算次方(2的N次方,2的随机次方)

1,使用 1 2 var value = 1//2的4次方 var value = 1Int(arc4random_uniform(...
  • mo_xiao_mo
  • mo_xiao_mo
  • 2017年05月26日 15:01
  • 713

Java程序练习-计算2的N次方

计算2的N次方 时间限制: 1000ms内存限制: 65536kB 描述 任意给定一个正整数N(N 输入 输入只有一个正整数N。 输出 输出2的N次方的值。 样例输入 5 样例输出...
  • binfeihan
  • binfeihan
  • 2011年10月10日 12:20
  • 8574
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用MSSQL计算2的10000次方
举报原因:
原因补充:

(最多只允许输入30个字)