李白好饮酒,
无事街上走;
提壶去打酒,
原有酒两斗;
遇店加一倍,
遇花喝一斗。
问:李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?
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
此博客通过算法揭秘李白打酒之旅,描述了他如何在遇到五家店和十朵花后酒尽的过程,展示了逻辑运算解决趣味问题的方法。
833

被折叠的 条评论
为什么被折叠?



