java 6789的10000次方,用MSSQL计算2的10000次方
在论坛看到 牛人们的 思路 特此收藏啊 以备学习
----------本机测试 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
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)
-------------------
java 6789的10000次方,用MSSQL计算2的10000次方相关推荐
- 为什么c语言2的n次方减一,计算2的N次方........有什么错吗?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 int a[MAX]=0; ---------------- 这一句不对吧... 运行结果 Please Input N :10 2的10次方= 4199 ...
- 2的零次方加到2的n次方c语言,计算2的N次方........有什么错吗?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 int a[MAX]=0; ---------------- 这一句不对吧... 运行结果 Please Input N :10 2的10次方= 4199 ...
- python计算2的n次方编写_Python计算一元函数的N次方多项式
第一种: from datetime import datetime #f(x)=a0+a1x+a2x*2+a3x**3+... def f(a,x): p=0 for i in range(0,le ...
- java 既然出现double类型×2的n次方的时候计算结果出现偏差
java 既然出现double类型×2的n次方的时候计算结果出现偏差! 代码如下: package Com.Aftvc.tsing; public class example { /** * @ ...
- java计算2的n次方_Java程序练习-计算2的N次方
计算2的N次方时间限制: 1000ms内存限制: 65536kB 描述任意给定一个正整数N(N<=100),计算2的N次方的值. 输入输入只有一个正整数N. 输出输出2的N次方的值. 样例输入5 ...
- java 计算x的n次方
x的n次方,可以用简单的迭代方法自乘n次,但这种方法十分低效. 可以用两种方法 代码如下: //计算x的n次方的方法, public class X_n {public static void mai ...
- 从键盘上录入两个整数,计算a的b次方的结果
从键盘上录入两个整数,计算a的b次方的结果 /*** 从键盘上录入两个整数,计算a的b次方的结果*/import java.util.Scanner;public class Test25 {publ ...
- 信息学奥数一本通(1170:计算2的N次方)
1170:计算2的N次方 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 15778 通过数: 8179 [题目描述] 任意给定一个正整数N(N<=1 ...
- [Java] 蓝桥杯BASIC-30 基础练习 阶乘计算
问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表 ...
最新文章
- GNUGK 作为Gatekeeper穿透防火墙和NAT
- PonyAI的首份美国无人出租成绩单:总数1271趟,15%拼车
- 【面试必备】java写spark好不好
- .net动态控件的使用(listview ,treeview,tabControl)
- mPaaS小程序技术架构深度解析
- 【opencv学习】基于透视变换和OCR识别的小票识别
- C++ 数据结构第二章 ----- 线性表
- BZOJ2769 : YY的快速排序
- wget 下载需要登录验证的网页文件
- 基础线性代数知识点总结与回顾(四):线性空间
- Tomcat中的ResourceBundle国际化解析
- JavaScript自动切换并播放视频 | Tampermonkey
- 计算机获取信息的过程是,“获取信息的过程与方法”的教学案例
- 【esp8266】【Node.js】【Websocket】esp8266和Node.js通过websocket进行通信,实验记录及踩坑记录
- C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法
- html中蝴蝶飞飞怎么制作,幼儿园小班《蝴蝶飞飞》教案
- 《设计心理学》学习笔记之设计未来(第四册)
- 《计算机组成原理》——计算题
- 世卫批准强生新冠疫苗紧急使用权;美洲邮轮业停摆一年后将复航;IMAX将入驻上海多个商业地标 | 美通企业周刊...
- 一键GHOST优盘版安装XP/win7系统
热门文章
- tp中url地址大小写问题
- Clr编写Insert Triggr
- 10-1 channel
- 15-4 队列实现调度器
- python抽取指定url页面的title_Python新手写爬虫全过程记录分析
- html中异步上传文件实现示例,HTML_html中异步上传文件实现示例,复制代码代码如下: form actio - phpStudy...
- vsn服务器 需要先建项目才能,急求!项目马上上线,但是Oracle服务器存在问题...
- android 多个模块,Android 模块化中两个模块之间传递model
- java大津法确定阈值,大津法得到自适应阈值
- Python: 函数参数传递机制