126.宝塔形数据得出处理

博客围绕宝塔形数据的处理展开,重点在于运用SQL语句对其进行操作,涉及到利用SQL的相关功能来得出处理结果,在信息技术领域的数据处理方面具有一定意义。

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

/*--

第一层   -                    1 
第二层   -           2                3
第三层   -      4        5        6        7
第四层   -    8   9   10   11   12   13   14  15 

将顺序的数据(1~N)依如下规则排列
1,排成塔形.
2,下一层所排数字是对上一层的两倍.(第一层为1个,第二层为2个,第三层4个,如此类推)
3,自上到下,自左到右紧密排列.

现在要找出每个号码下面号码的个数.

*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_id]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id_num]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_id_num]
GO

--得到每个号码下面包含的号码
create function f_id(
@num int,		--那个数下面的子
@max_level int	--统计到第几层
)returns @re table(id int identity(1,1),num int,level int)
as 
begin
	declare @level int,@left int,@i int,@j int
	select @level=0,@i=@num
	while @i>1
		select @level=@level+1,@i=@i/2
	if @level<@max_level
	begin
		insert @re values(@num,@level+1)
		select @left=(@num%power(2,@level))*2
			,@level=@level+1
			,@num=power(2,@level)
			,@i=0,@j=2
		while @level<@max_level
		begin
			while @i<@j
			begin
				insert @re values(@left+@num+@i,@level+1)
				set @i=@i+1
			end
			select @level=@level+1
				,@left=@left*2
				,@num=@num*2
				,@i=0,@j=@j*2
		end
	end
	return
end
go

--得到每个号码下面包含的号码个数(作者: DigJim(挖土) )
create function f_id_num(
@inputnum int,		--数字
@totallevel int		--层数
)returns int 
as
begin 
	declare @i int,@count int,@result float

	--判断这个数所在的层
	select @i=1
		,@result=@inputnum/2
	
	while @result-1>0
		select @result=@result/2,@i=@i+1
	set @i=@totallevel-@i-1

	--计算这个数包含的个数
	set @count =2
	while @i>0
		select @count=@count*2,@i=@i-1
	return @count-2
end
go

--调用实现查询
select * from f_id(3,4)

select dbo.f_id_num(3,4)
go

/*--测试结果
id          num         level       
----------- ----------- ----------- 
1           3           2
2           6           3
3           7           3
4           12          4
5           13          4
6           14          4
7           15          4

(所影响的行数为 7 行)
--*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值