您的位置:首页 > 其它

利用算术(加减乘除)的方法实现从1到9计算等于100

2014-11-13 10:28 441 查看
原贴地址:http://topic.csdn.net/u/20100414/13/01a10c02-8230-4f0b-89d1-e0a51a64a97c.html?seed=1728387417
 
123456789
这九个按顺序排列的数,要求在它们之间插入若干个+,-,*,/ ,
使其结果正好等于如:1*2*3*4+5+6+7*8+9=100  
 
---------------------------------------------------------------------
--  Author : htl258(Tony)
--  Date   : 2010-04-19 01:05:31
--  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
--          Jul  9 2008 14:43:34
--          Copyright (c) 1988-2008 Microsoft Corporation
--          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
---------------------------------------------------------------------
 
--游标法
SET NOCOUNT ON
DECLARE @T TABLE(R NVARCHAR(1))
INSERT @T SELECT '+'
UNION ALL SELECT '-'
UNION ALL SELECT '*'
UNION ALL SELECT '/'
DECLARE @S NVARCHAR(50),@I DEC(28,10)
DECLARE @R TABLE(RESULT NVARCHAR(30))
DECLARE C CURSOR FOR
    SELECT 'SELECT @I=1.'+A.R+'2.'+B.R+'3.'+C.R+'4.'
       +D.R+'5.'+E.R+'6.'+F.R+'7.'+G.R+'8.'+H.R+'9.'
    FROM @T A,@T B,@T C,@T D,@T E,@T F,@T
G,@T H
OPEN C
FETCH C INTO @S
WHILE @@FETCH_STATUS=0
BEGIN
    EXEC SP_EXECUTESQL @S,N'@I DEC(28,10) OUT',@I OUT
    IF CEILING(@I)=100 AND FLOOR(@I)=100
    INSERT @R SELECT REPLACE(STUFF(@S,1,CHARINDEX('=',@S),''),'.','')
    FETCH C INTO @S
END
CLOSE C
DEALLOCATE C
SET NOCOUNT OFF
SELECT * FROM @R
 
/*
RESULT
------------------------------
1+2+3+4+5+6+7+8*9
1*2*3+4+5+6+7+8*9
1-2*3+4*5+6+7+8*9
1+2*3+4*5-6+7+8*9
1-2*3-4+5*6+7+8*9
1-2*3-4-5+6*7+8*9
1+2+3-4*5+6*7+8*9
1*2*3-4*5+6*7+8*9
1*2*3*4+5+6+7*8+9
1*2*3*4+5+6-7+8*9
1+2-3*4+5*6+7+8*9
1+2-3*4-5+6*7+8*9
1-2+3*4*5+6*7+8-9
1-2+3*4*5-6+7*8-9
1+2*3*4*5/6+7+8*9
 
(15 行受影响)
*/
 
--循环法:原著happycell188(喜喜) 改编完善:
htl258(Tony)
set nocount on
declare @result nvarchar(50),@temp_int dec(28,10),@str nvarchar(5),
    @i1 int,@str1 char(1),
    @i2 int,@str2 char(1),
    @i3 int,@str3 char(1),
    @i4 int,@str4 char(1),
    @i5 int,@str5 char(1),
    @i6 int,@str6 char(1),
    @i7 int,@str7 char(1),
    @i8 int,@str8 char(1)
declare @temp_tb table(result nvarchar(30))
--赋值
select @str='+/-*',@i1=1,@i2=1,@i3=1,@i4=1,@i5=1,@i6=1,@i7=1,@i8=1
--函数主体
while(@i1<5)
begin
    while(@i2<5)
    begin
        while(@i3<5)
        begin
            while(@i4<5)
            begin
                while(@i5<5)
                begin
                    while(@i6<5)
                    begin
                        while(@i7<5)
                        begin
                            while(@i8<5)
                            begin
                                select
                                @str1=substring(@str,@i1,1),
                                @str2=substring(@str,@i2,1),
                                @str3=substring(@str,@i3,1),
                                @str4=substring(@str,@i4,1),
                                @str5=substring(@str,@i5,1),
                                @str6=substring(@str,@i6,1),
                                @str7=substring(@str,@i7,1),
                                @str8=substring(@str,@i8,1)
                                select @result='select @a=1.'+@str1+'2.'
                                +@str2+'3.'+@str3+'4.'+@str4+'5.'
                                +@str5+'6.'+@str6+'7.'+@str7+'8.'+@str8+'9.'
                                exec sp_executesql @result,
                                N'@a dec(28,10) output',@temp_int output
                                if floor(@temp_int)=100 and ceiling(@temp_int)=100
                                begin
                                    insert into @temp_tb(result)
                                   select right(replace(@result,'.',''),17)
                                end
                                select @i8=@i8+1
                            end
                        select @i7=@i7+1,@i8=1
                        end
                    select @i6=@i6+1,@i7=1,@i8=1
                    end
                select @i5=@i5+1,@i6=1,@i7=1,@i8=1
                end
            select @i4=@i4+1,@i5=1,@i6=1,@i7=1,@i8=1
            end
        select @i3=@i3+1,@i4=1,@i5=1,@i6=1,@i7=1,@i8=1
        end
    select @i2=@i2+1,@i3=1,@i4=1,@i5=1,@i6=1,@i7=1,@i8=1
    end
select @i1=@i1+1,@i2=1,@i3=1,@i4=1,@i5=1,@i6=1,@i7=1,@i8=1
end
set nocount off
--获取结果
select result from @temp_tb
 
/*
result
------------------------------
1+2+3+4+5+6+7+8*9
1+2+3-4*5+6*7+8*9
1+2-3*4+5*6+7+8*9
1+2-3*4-5+6*7+8*9
1+2*3+4*5-6+7+8*9
1+2*3*4*5/6+7+8*9
1-2+3*4*5+6*7+8-9
1-2+3*4*5-6+7*8-9
1-2*3+4*5+6+7+8*9
1-2*3-4+5*6+7+8*9
1-2*3-4-5+6*7+8*9
1*2*3+4+5+6+7+8*9
1*2*3-4*5+6*7+8*9
1*2*3*4+5+6+7*8+9
1*2*3*4+5+6-7+8*9
(15 行受影响)
*/
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/14/5486144.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: