【来挑战吧】用MSSQL计算2的10000次方

guguda2008 2011-01-08 06:15:49
加精
好吧我们知道BIGINT的最大值是2^63-1,也就是9,223,372,036,854,775,807,那么2^64是多少呢?再往上呢?穷极无聊的我写了个计算2的N次方的语句,不过超过100后好像速度就慢下来了,用这个语句计算10000次方花了10分钟才出来数。放出300技术分,看看谁写的SQL语句能最快的算出2的10000次方。如果能写出瞬间计算出来的语句,立刻结帖
取巧的不算,比如把我帖的结果直接SELECT出来的
本活动最终解释权归本鸭所有
...全文
4179 170 打赏 收藏 转发到动态 举报
写回复
用AI写文章
170 条回复
切换为时间正序
请发表友善的回复…
发表回复
dg831451 2012-02-25
  • 打赏
  • 举报
回复
太厉害了。。2的1000方都算出来了。
limitstar 2012-02-24
  • 打赏
  • 举报
回复
真是无聊
Aaxf1010 2011-10-12
  • 打赏
  • 举报
回复
厉害!
tcjacky 2011-07-06
  • 打赏
  • 举报
回复
这是我的另个算法 2的1万次方本机 2分55秒
--2的n次方 --tcjack 著作

DECLARE @DATAFINALLY VARCHAR(5000);--存储容器
DECLARE @i INT;--循环变量
DECLARE @TOTALCOUNT INT ;--次方 总的循环次数

SET @DATAFINALLY ='-1';--赋初始值
SET @i=0;--赋初始值
SET @TOTALCOUNT =10000;--赋初始值

WHILE @i<@TOTALCOUNT
BEGIN
--设置修改状态
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-0','+00');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-1','+02');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-2','+04');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-3','+06');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-4','+08');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-5','+10');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-6','+12');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-7','+14');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-8','+16');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'-9','+18');
--计算
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'0+','');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'+0','');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'1+1','2');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'2+1','3');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'3+1','4');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'4+1','5');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'5+1','6');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'6+1','7');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'7+1','8');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'8+1','9');

--将第一位的+和0去掉
SET @DATAFINALLY = REPLACE (@DATAFINALLY,'+','');

--设置未修改状态
if (@i<@TOTALCOUNT-1)
BEGIN
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'0','-0');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'1','-1');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'2','-2');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'3','-3');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'4','-4');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'5','-5');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'6','-6');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'7','-7');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'8','-8');
SET @DATAFINALLY =REPLACE (@DATAFINALLY,'9','-9');
END
--设置循环状态
SET @i=@i+1;
END

PRINT 'THE RESULT OF 2 ^ '+CAST(@TOTALCOUNT AS VARCHAR(10))+' IS :'+ @DATAFINALLY


phenloo 2011-07-06
  • 打赏
  • 举报
回复
都是高人
tcjacky 2011-07-05
  • 打赏
  • 举报
回复
我写了一个算法 1000次方3秒出结果 5000次方2分34秒 现在在改进算法看看能否再提速
tcjacky 2011-07-05
  • 打赏
  • 举报
回复
--2的n次方 tcjacky著作

DECLARE @FLAG INT;--进位标志 用0 1 表示 用INT型是为了不用转换
DECLARE @DATAFINALLY VARCHAR(5000);--存储容器
DECLARE @i INT;--循环变量
DECLARE @j INT;--循环变量
DECLARE @LEN INT ;--数据长度
DECLARE @LENTMEP INT;--数据长度控制变量
DECLARE @INTTEMP INT;
DECLARE @VARCHAR2 VARCHAR(2);
DECLARE @TOTALCOUNT INT ;--次方 总的循环次数

SET @DATAFINALLY ='1';--赋初始值
SET @i=0;--赋初始值
SET @j=1;--赋初始值
SET @TOTALCOUNT =10000;--赋初始值
SET @FLAG =0;

WHILE @i<@TOTALCOUNT
BEGIN
SET @j=1;
SET @FLAG =0;
SET @LEN =LEN (@DATAFINALLY);
WHILE @j <=@LEN
BEGIN
SET @LENTMEP =LEN (@DATAFINALLY);
SET @INTTEMP =2*SUBSTRING(@DATAFINALLY,@LENTMEP-@j+1,1);
-- 针对不可能有大于100的数据 根据判断 如果是最后一位的计算 并且@LENTMEP是两位则取2位 否则以取最后一位即可
SET @VARCHAR2=CASE @LENTMEP WHEN @J THEN RIGHT (@INTTEMP +@FLAG,2) ELSE RIGHT (@INTTEMP +@FLAG,1) END;
SET @FLAG =CASE LEN(@INTTEMP) WHEN 2 THEN 1 ELSE 0 END;
SET @DATAFINALLY =SUBSTRING(@DATAFINALLY ,1,@LENTMEP-@j)+@VARCHAR2+SUBSTRING(@DATAFINALLY,@LENTMEP-@j+2,@j);
SET @j=@j+1;
END
SET @i=@i+1;
END

PRINT 'THE RESULT OF 2 ^ '+CAST(@TOTALCOUNT AS VARCHAR(10))+' IS :'+ @DATAFINALLY
tcjacky 2011-07-05
  • 打赏
  • 举报
回复
我改进了 算法 本机2的5000次方1分55秒 服务器50秒;2的10000次方 本机7分49秒 服务器5分54秒 服务器6核 本机2核 代码


THE RESULT OF 2 ^ 10000 IS :19950631168807583848837421626835850838234968318861924548520089498529438830221946631919961684036194597899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550086918193311542508608460618104685509074866089624888090489894838009253941633257850621568309473902556912388065225096643874441046759871626985453222868538161694315775629640762836880760732228535091641476183956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459297773279665775606172582031407994198179607378245683762280037302885487251900834464581454650557929601414833921615734588139257095379769119277800826957735674444123062018757836325502728323789270710373802866393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241708340807605932320161268492288496255841312844061536738951487114256315111089745514203313820202931640957596464756010405845841566072044962867016515061920631004186422275908670900574606417856951911456055068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376393903373455801407636741877711055384225739499110186468219696581651485130494222369947714763069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297871557517947385246369446923087894265948217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031122249937969999226781732358023111862644575299135758175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536962622018963571028812361567512543338303270029097668650568557157505516727518899194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703911550639789000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461509704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376
peijch02 2011-01-22
  • 打赏
  • 举报
回复
牛的很
wzb56 2011-01-15
  • 打赏
  • 举报
回复

有个经典的算法,叫重复平方法:

即,首先将指数转化为二进制数,
若该二进制数有n+1位,
那么只需n次循环,
首位必为1,从该二进制数的高位开始即n-1位,

指数转化的二进制数在数组a[n]中,若第n位为最高位且为1,则算法如下:


y=x;
for( i= n-1; i<=0; i++)
{
y=y*y;
if(a[i]==1) y *= x;


}
return y;

只是算法而已,还与具体的技术有关,例如,如何表示一个超过系统所能表达的范围的大数,以及大数的乘法等等,
我不懂SQL, 不知道怎么实现。
cdyitian 2011-01-14
  • 打赏
  • 举报
回复
围观,看看谁最无聊

MSOKD 2011-01-14
  • 打赏
  • 举报
回复
人家电脑配置好

[Quote=引用 32 楼 qianjin036a 的回复:]
一大早起来被鸭子忽悠了!

说是10分钟运行那个程序,结果足足干了25分钟!
然后又花掉一个小时弄出一个快的程序来,贴出来以后发现和鸭子走的结果不一样,继续再花大半天时间改成,好不容易......

洗脸刷牙弄吃的去!!!
[/Quote]
WuBill 2011-01-14
  • 打赏
  • 举报
回复
不挑战,不想分,只观战,看高人
yhj4633892 2011-01-13
  • 打赏
  • 举报
回复
引用 18 楼 haiwer 的回复:

引用 5 楼 feixianxxx 的回复:
不挑战 只围观~
.

……………………
++++很强大 学习了
hpyfei 2011-01-13
  • 打赏
  • 举报
回复
hen hao hen hao
YangpiMajia 2011-01-13
  • 打赏
  • 举报
回复
现在sql的数值型最大精度是64位(9,223,372,036,854,775,807),所以要最高效率,可以一次处理18位长字符串,
YangpiMajia 2011-01-13
  • 打赏
  • 举报
回复
超大整数无损计算,其实是非常有用的,

以前想过的一个思路,没有实际写出来,

就是转换成字符串8位 8位相加或相减,来实现对超大整数的无损计算。
guguda2008 2011-01-13
  • 打赏
  • 举报
回复
呵呵,用位运算的算法肯定是最快的,不过单这一种不够爽,各种算法都有才能开拓思路,大家用不同的方法得出相同的结果不是更有趣吗?LS上各种算法都已经看的我眼花了,这帖开的太值了
guguda2008 2011-01-13
  • 打赏
  • 举报
回复
结帖了,按照开始的说法,300分全部给第一个写出秒杀算法的睛天大大,其它大大的语句慢慢看~
sadikaqy 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 haiwer 的回复:]
引用 5 楼 feixianxxx 的回复:
不挑战 只围观~
.
[/Quote]
~~~
加载更多回复(101)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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