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

原贴地址: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值