李白打酒(SQL实现)

此博客通过算法揭秘李白打酒之旅,描述了他如何在遇到五家店和十朵花后酒尽的过程,展示了逻辑运算解决趣味问题的方法。

李白好饮酒,
无事街上走;
提壶去打酒,
原有酒两斗;
遇店加一倍,
遇花喝一斗。
问:李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?

DECLARE @count INT=0 
DECLARE @I INT=16384
DECLARE @sum INT
DECLARE @flower INT 
DECLARE @store INT 
DECLARE @K1 INT 
DECLARE @K2 INT
DECLARE @J INT  
DECLARE @T INT
DECLARE @S VARCHAR(50)  
WHILE @I<32768
BEGIN
	SET @sum=2
	SET @flower= 0 
    SET @store=0
    SET @K1=@I
    SET @K2=@I
    SET @J=0
    WHILE @J<15
    BEGIN 
		IF @K1%2=1 
		BEGIN 
			SET @flower=@flower+1
			SET @sum=@sum-1
		END	
		ELSE 
		BEGIN
			 SET @store=@store+1
             SET @sum=@sum*2
		END 
		
		IF @sum<0  
			BREAK
		IF @flower>10
			BREAK 
        IF @store>5
			BREAK 
		SET @k1=@K1/2 
		
		SET @J=@J+1
    END 
    IF @j=15 AND @sum=0
    BEGIN
		SET @count=@count+1
		SET @t=15
		SET @S=''
		WHILE @t>0
		BEGIN
			IF(@k2%2=1)
			    SET @S=@S+'花'
            ELSE            
				SET @S=@S+'店'
            
            SET @k2=@K2/2
			SET @t=@t-1
		END 
		PRINT @S
    END           
	SET @I=@I+1	
END  
;WITH ct1
AS
(
	SELECT CONVERT(VARCHAR(100),'花') AS A 
	UNION 
	SELECT CONVERT(VARCHAR(100),'店') AS A 
)
,ct2
AS
(
	SELECT A,1 AS B,2*IIF(A='店',2,1) - IIF( A='花',1,0) AS C  FROM ct1 
	UNION ALL 
	SELECT CONVERT(VARCHAR(100),B.A+A.A),B+1 ,C*IIF(A.A='店',2,1) - IIF( A.A='花',1,0)
	FROM ct1 A,ct2 B WHERE B<15 AND C>0
)
SELECT A FROM ct2 WHERE B=15 AND A LIKE '%花' AND C=0 AND LEN(REPLACE(A,'店',''))=10

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值