sql 游戏~四数,+-*/~得另一数---小结(原创)
CREATE FUNCTION f_ww(@var varchar(50),@vs varchar(50))
RETURNS char(1)
AS
begin
if len(@var) <> len(@vs)
RETURN 'F '
declare @str varchar(50),@char varchar(10)
declare @varcharint int,@vscharint int
declare @varstr varchar(50),@vsstr varchar(50)
set @str=@var+ ', '
while charindex( ', ',@str)> 0
begin
select @char=substring(@str,0,charindex( ', ',@str)),
@str=substring(@str,charindex( ', ',@str)+1,len(@str)-charindex( ', ',@str)),
@varcharint=0,@vscharint=0,
@varstr= ', '+@var+ ', ', @vsstr= ', '+@vs+ ', '
while(charindex( ', '+@char+ ', ',@varstr))> 0
begin
select @varcharint=@varcharint+1,
@varstr=substring(@varstr,charindex( ', '+@char+ ', ',@varstr)+1+len(@char),len(@varstr))
end
while(charindex( ', '+@char+ ', ',@vsstr))> 0
begin
select @vscharint=@vscharint+1,
@vsstr=substring(@vsstr,charindex( ', '+@char+ ', ',@vsstr)+1+len(@char),len(@vsstr))
end
if(@varcharint <> @vscharint)
RETURN 'F '
end
RETURN 'T '
end
go
create proc p_ww
@int1 dec(18,4),
@int2 dec(18,4),
@int3 dec(18,4),
@int4 dec(18,4),
@result dec(18,4)
as
begin
set nocount on
select DISTINCT a.id [aid],b.id [bid],c.id [cid],d.id [did] into #wei
from (select @int1 [id]
union all select @int2
union all select @int3
union all select @int4) a,(select @int1 [id]
union all select @int2
union all select @int3
union all select @int4) b,(select @int1 [id]
union all select @int2
union all select @int3
union all select @int4) c,(select @int1 [id]
union all select @int2
union all select @int3
union all select @int4) d
where dbo.f_ww(rtrim(a.id)+ ', '+ rtrim(b.id)+ ', '+ rtrim(c.id)+ ', '+ rtrim(d.id),rtrim(@int1)+ ', '+rtrim(@int2)+ ', '+rtrim(@int3)+ ', '+rtrim(@int4))= 'T '
create table #show(mula varchar(100),result int)
declare @count1 varchar(10),@count2 varchar(10),@count3 varchar(10)
declare @operator1 varchar(2),@operator2 varchar(2),@operator3 varchar(2)
set @count1= '+,-,*,/, '
while(charindex( ', ',@count1)> 0)
begin
select @operator1=substring(@count1,0,charindex( ', ',@count1)),
@count1=substring(@count1,charindex( ', ',@count1)+1,len(@count1))
set @count2= '+,-,*,/, '
while(charindex( ', ',@count2)> 0)
begin
select @operator2=substring(@count2,0,charindex( ', ',@count2)),
@count2=substring(@count2,charindex( ', ',@count2)+1,len(@count2))
set @count3= '+,-,*,/, '
while(charindex( ', ',@count3)> 0)
begin
select @operator3=substring(@count3,0,charindex( ', ',@count3)),
@count3=substring(@count3,charindex( ', ',@count3)+1,len(@count3))
declare @sql nvarchar(4000)
--a/(b/(c/d))
select @sql= 'insert into #show select replace(rtrim(aid)+@stroperator1+ ' '( ' '+rtrim(bid)+@stroperator2+ ' '( ' '+rtrim(cid)+@stroperator3+rtrim(did)+ ' ')) ' ', ' '.0000 ' ', ' ' ' '),aid '+@operator1+ '(bid '+@operator2+ '(cid '+@operator3+ 'did))
from #wei where case when @stroperator3= ' '/ ' 'and did=0 then null
when @stroperator2= ' '/ ' 'and cid '+@operator3+ 'did=0 then null
when @stroperator1= ' '/ ' 'and bid '+@operator2+ '(cid '+@operator3+ 'did)=0 then null
else aid '+@operator1+ '(bid '+@operator2+ '(cid '+@operator3+ 'did)) end= '+rtrim(@result)
,@sql=@sql+char(10)+ --a/((b/c)/d)
'insert into #show select replace(rtrim(aid)+@stroperator1+ ' '(( ' '+rtrim(bid)+@stroperator2+rtrim(cid)+ ' ') ' '+@stroperator3+rtrim(did)+ ' ') ' ', ' '.0000 ' ', ' ' ' '),aid '+@operator1+ '((bid '+@operator2+ 'cid) '+@operator3+ 'did)
from #wei where case when @stroperator3= ' '/ ' 'and did=0 then null
when @stroperator2= ' '/ ' 'and cid=0 then null
when @stroperator1= ' '/ ' 'and ((bid '+@operator2+ 'cid) '+@operator3+ 'did)=0 then null
else aid '+@operator1+ '((bid '+@operator2+ 'cid) '+@operator3+ 'did) end= '+rtrim(@result)
,@sql=@sql+char(10)+ --((a/b)/c)/d
'insert into #show select replace( ' '(( ' '+rtrim(aid)+@stroperator1+rtrim(bid)+ ' ') ' '+@stroperator2+rtrim(cid)+ ' ') ' '+@stroperator3+rtrim(did), ' '.0000 ' ', ' ' ' '),((aid '+@operator1+ 'bid) '+@operator1+ 'cid) '+@operator1+ 'did
from #wei where case when @stroperator3= ' '/ ' 'and did=0 then null
when @stroperator2= ' '/ ' 'and cid=0 then null
when @stroperator1= ' '/ ' 'and ((bid '+@operator2+ 'cid) '+@operator3+ 'did)=0 then null
else ((aid '+@operator1+ 'bid) '+@operator1+ 'cid) '+@operator1+ 'did end= '+rtrim(@result)
,@sql=@sql+char(10)+ --(a/(b/c))/d
'insert into #show select replace( ' '( ' '+rtrim(aid)+@stroperator1+ ' '( ' '+rtrim(bid)+@stroperator2+rtrim(cid)+ ' ')) ' '+@stroperator3+rtrim(did), ' '.0000 ' ', ' ' ' '),(aid '+@operator1+ '(bid '+@operator2+ 'cid)) '+@operator3+ 'did
from #wei where case when @stroperator3= ' '/ ' 'and did=0 then null
when @stroperator2= ' '/ ' 'and cid=0 then null
when @stroperator1= ' '/ ' 'and bid '+@operator2+ 'cid=0 then null
else (aid '+@operator1+ '(bid '+@operator2+ 'cid)) '+@operator3+ 'did end= '+rtrim(@result)
,@sql=@sql+char(10)+ --a/(b/(c/d))
'insert into #show select replace( ' '( ' '+rtrim(aid)+@stroperator1+rtrim(bid)+ ' ') ' '+@stroperator2+ ' '( ' '+rtrim(cid)+@stroperator3+rtrim(did)+ ' ') ' ', ' '.0000 ' ', ' ' ' '),(aid '+@operator1+ 'bid) '+@operator2+ '(cid '+@operator3+ 'did)
from #wei where case when @stroperator3= ' '/ ' 'and did=0 then null
when @stroperator2= ' '/ ' 'and cid '+@operator3+ 'did=0 then null
when @stroperator1= ' '/ ' 'and did=0 then null
else (aid '+@operator1+ 'bid) '+@operator2+ '(cid '+@operator3+ 'did) end= '+rtrim(@result)
exec sp_executesql
@sql
,N '@stroperator1 varchar(2),@stroperator2 varchar(2),@stroperator3 varchar(2) '
,@stroperator1=@operator1,@stroperator2=@operator2,@stroperator3=@operator3
end
end
end
select * from #show
drop table #show
drop table #wei
end
----------------------------
--测试
exec p_ww 1,1,1,13,24
exec p_ww 1,6,0.6,0.8,24
drop FUNCTION dbo.f_ww
drop proc p_ww
[解决办法]
哈哈,看来好多人写这个了~顶
[解决办法]
好!
好帖!
很好帖!
确实好帖!
少见的好帖!
真他妈的好帖!
难得一见的好帖!
千年等一回的好帖!
好得不能再好的好帖!
惊天地且泣鬼神的好帖!
让人阅毕击掌三叹的好帖!
让人佩服得五体投地的好帖!
让人奔走相告曰须阅读的好帖!
让楼主看后决定加精固顶的好帖!
让人看后在各论坛纷纷转贴的好帖!
让人看后连成人网站都没兴趣的好帖!
让人看完后就要往上顶往死里顶的好帖!
让人看后不断在各种场合重复引用的好帖!
让人一见面就问你看过某某好帖没有的好帖!
让人半夜上厕所都要打开电脑再看一遍的好帖!
让人读过后都下载在硬盘里详细研究欣赏的好帖!
让人走路吃饭睡觉干什么事连做梦都梦到它的好帖!
让人翻译成36种不同外语流传国内外世界各地的好帖!
让人纷纷提倡过年过节不送礼要送就送某某帖子的好帖!
让国家领导人命令将该帖刻在纯金版上当国礼送人的好帖!
让网络上纷纷冒出该帖的卡通版漫画版搞笑版夸张版的好帖!
让人在公共厕所里不再乱涂乱化而是纷纷对它引经据典的好帖!
让某些想成名的人向网络宣传他与该帖作者1024代同祖先的好帖!
让人根据它写成小说又被不同导演拍成48个不同版本的电影的好帖!
让某名导演跟据此帖改拍的电影在奥斯卡上一连拿了11个奖项的好帖!
让人大代表们看完后联名要求根据该帖的内容对宪法做适当修改的好帖!
让人为了谁是它的原始作者纷纷地闹上法院打官司要争得它的版权的好帖!
让各大学府纷纷邀请该帖作者去就如何发表优秀网络文学为题目演讲的好帖!
让人为了该帖而成立了各种学会来研究并为不同的理解争得眼红脖子粗的好帖!
让美国警察于今后逮捕人说你有权保持沉默还有权阅读某某帖子要不要啊的好帖!
让本拉登躲在山洞里还命令他手下冒着被美军发现的危险去上网下载来阅读的好帖!
让萨达姆被捕时被发现他随身携带的除了一把手枪之外还有的就是它的复印件的好帖!
让比尔盖茨在懂事会上发给与会者人手一份该帖命令仔细阅读后才讨论其他事宜的好帖!
让诺贝儿奖理事会破天荒地因该帖的出现而开会讨论一直决定今后设立最佳帖子奖的好帖!
让联合国安理会决定将它译成宇宙语由中国神州六号升空后不断播放看有没有外星人的好帖!
让人看完后IE锁死连瑞星诺顿都没法修复只好格式化硬盘重装启动后主页看到的还是它的好贴!
让某人稍对本帖加以修改制成专题网页不出一天点击率超过搜狐新浪网易所有之历史总合的好贴!
让全世界网民一上网就只欣赏这张帖子因特网其他网页几近瘫痪某大侠提出查封立即被群殴的好贴!
让全宇宙时空混乱各星球外星人收到讯息后为抢先来地球欣赏这张帖子展开宇宙大战同归于尽的好贴!!!
[解决办法]
顶
------解决方案--------------------
有不完善的地方,比如exec p_ww 1,1,1,13,24
出来两个结果(1+1)*(13-1)24
(13-1)*(1+1)24
其实这两个在数学意义上来是完全一样的.
代码还没看,好多,
lz好强啊.
[解决办法]
砍...
[解决办法]
真強,寫這麼多
[解决办法]
呵呵,改天把我写的也贴出来.
如果没有括号的话很简单,嵌套四个循环,穷举即可.
如果要加括号,就要保证加的括号是有意义的,即加了括号一定会改变表达式的值.实现这个需求如果也用穷举的话代码就太臃肿了
[解决办法]
(a/(b/c))/d
=
a*c/b/d
[解决办法]
比较汗,没有一个说明的文字,只靠到A-Z的字符 呵呵。
楼主能否把大致的逻辑共享与大家,非常感谢!
[解决办法]
日
军
[解决办法]
要不...
誰有空的,把數字个數也動態一下...暫定10個以內吧
*_*