首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sql 游戏~四数,+-/~得另一数-小结(原创)解决方案

2012-03-31 
sql 游戏~四数,+-*/~得另一数---小结(原创)CREATEFUNCTIONf_ww(@varvarchar(50),@vsvarchar(50))RETURNSch

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個以內吧
*_*

热点排行