你能用算术运算符+、-、*、/ 及左右括号使3、4、5、6的结果等于28吗?每个数字只能用一次,每个算术运算符和括号也只能用一次

lg3605119 2009-04-15 10:33:48
如题
高手最好能写成通用的,就是数字和结果改变也能使用。期待解答!
...全文
493 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuifengde 2009-04-17
  • 打赏
  • 举报
回复
--result/*
(3/5)+6*4
(3+5/4)*6
(3+5-4)*6
(3/5)+4*6
(3-4+5)*6
(4*6)-3/5
(4*6)+3/5
(4+3/5)*6
(4-3/5)*6
4*(3/5+6)
(5-4/3)*6
(5-4+3)*6
(5/4+3)*6
(5+3-4)*6
6*(5-4/3)
6*(5/4+3)
6*(5-4+3)
6*(5+3-4)
(6+3/5)*4
(6-3/5)*4
6*(3/5+4)
6*(3+5/4)
6*(3+5-4)
(6*4)-3/5
(6*4)+3/5
6*(3-4+5)
*/
chuifengde 2009-04-17
  • 打赏
  • 举报
回复
CREATE PROC getll(@sql1 nVARCHAR(20),@sql2 nVARCHAR(20),@sql3 nVARCHAR(20),@sql4 nVARCHAR(20),@sql5 nvarchar(20),@N INT,@r nvarchar(20) OUT )
AS
declare @sql nvarchar(500)
DECLARE @x INT ,@y INT, @c INT ,@d INT ,@e int

SET @sql=N'select @x='+@sql1+',@y='+@sql2+',@c='+@sql3+',@d='+@sql4 +',@e='+@sql5
exec sp_executesql @sql,N'@x int out,@y int out ,@c int out ,@d int out,@e int out',@x OUT,@y OUT ,@c OUT ,@d OUT ,@e OUT
IF @x=@n
SET @r=@sql1
ELSE IF @y =@n
SET @r=@sql2
ELSE IF @c=@n
SET @r=@sql3
ELSE IF @d=@N
SET @r=@sql4
ELSE IF @e=@n
SET @r=@sql5
ELSE
SET @r=''

RETURN

GO
DECLARE @a TABLE(a VARCHAR(2))
INSERT @a SELECT '3'
UNION ALL SELECT '4'
UNION ALL SELECT '5'
UNION ALL SELECT '6'
DECLARE @b TABLE(a VARCHAR(2))
INSERT @b SELECT '+'
UNION ALL SELECT '-'
UNION ALL SELECT '*'
UNION ALL SELECT '/'

DECLARE @s TABLE(a VARCHAR(100),b VARCHAR(100),c VARCHAR(100),d VARCHAR(100),e VARCHAR(100))
INSERT @s
SELECT x+a.a+a1.a+b.a+y+a2.a+c.a+a3.a+d.a a,
x+a.a+a1.a+b.a+a2.a+c.a+y+a3.a+d.a b,
a.a+a1.a+x+b.a+a2.a+c.a+y+a3.a+d.a c,
a.a+a1.a+x+b.a+a2.a+c.a+a3.a+d.a+y d,
a.a+a1.a+b.a+a2.a+x+c.a+a3.a+d.a+y e
FROM @a a,@a b,@a c,@a d,
@b a1,@b a2,@b a3,@b a4,(SELECT '(' x) xx, (SELECT ')' y)yy
WHERE a.a<>b.a AND a.a<>c.a AND a.a<>d.a AND b.a<>c.a AND b.a<>d.a AND c.a<>d.a
and a1.a<>a2.a AND a1.a<>a3.a AND a1.a<>a4.a
AND a2.a<>a3.a AND a2.a<>a4.a
AND a3.a<>a4.a

DECLARE @aa VARCHAR(20),@bb VARCHAR(20),@cc VARCHAR(20),@dd VARCHAR(20),@ee VARCHAR(20)
DECLARE @l VARCHAR(200)
DECLARE @r VARCHAR(20)

DECLARE @n INT
SET @n=24
DECLARE cur CURSOR FOR SELECT a,b,c,d,e FROM @s
OPEN cur
FETCH NEXT from cur INTO @aa ,@bb ,@cc ,@dd, @ee
WHILE @@FETCH_STATUS=0
BEGIN
EXEC getll @aa,@bb,@cc,@dd,@ee,@N,@l OUT
IF @l<>''
PRINT @l
FETCH NEXT FROM cur INTO @aa ,@bb ,@cc ,@dd, @ee
END
CLOSE CUR
DEALLOCATE cur
等不到来世 2009-04-17
  • 打赏
  • 举报
回复
看了一下LZ的题目,居然还有这个要求:每个符号只能用一次。。。
那还得改进一下,不想改了
等不到来世 2009-04-17
  • 打赏
  • 举报
回复
参数检查部分不是很完善,不过无关紧要,不想写那么鲁棒
等不到来世 2009-04-17
  • 打赏
  • 举报
回复
--使用示例:
exec myCal 3,4,5,6,28
/*
formula result
-----------------
(6/3+5)*4 28
*/

exec myCal 5,5,5,1
/*
formula result
-----------------
(5-(1/5))*5 24
*/

exec myCal -1,0,1.2,5
/*
请输入合法参数(正整数)
*/
等不到来世 2009-04-17
  • 打赏
  • 举报
回复
写了一天,累死了。
用了2-3个临时表存储中间结果,
尽量去除了不必要的数据,
最大的一个也控制在千行左右,
效率应该还是比较高的。
if object_id('myCal','P') is not null
drop proc myCal
go
create proc myCal
@a dec(18,3),
@b dec(18,3),
@c dec(18,3),
@d dec(18,3),
@result int=24
as
set nocount on
--1.参数检查与初始化
if isnull(floor(@a),-1)<isnull(@a,0) or isnull(floor(@b),-1)<isnull(@b,0)
or isnull(floor(@c),-1)<isnull(@c,0) or isnull(floor(@d),-1)<isnull(@d,0)
begin
print '请输入合法参数(正整数)'
return
end

select id=identity(int),val into #val --数据表
from(select @a val union all select @b union all select @c union all select @d) t

select id=identity(int),sig into #sign --符号表
from(select '+' sig union all select '-' union all select '*' union all select '/') t

--2.先取两个数的所有有效组合
select a.id aid,s.id s1,b.id bid,a.val a,b.val b
,formula=rtrim(a.val)+s.sig+rtrim(b.val)
,result=case s.id when 1 then a.val+b.val when 2 then a.val-b.val when 3 then a.val*b.val when 4 then a.val/b.val end
into #1
from #val a,#sign s,#val b
where (s.id in(1,3) and a.id<b.id) or (s.id=2 and a.id<>b.id and a.val>=b.val) or (s.id=4 and a.id<>b.id)
--select * from #1

--3.加入第三个数
select a.aid,a.s1,a.bid,s.id s2,b.id cid,b.val c
,formula=case when a.s1 in(1,2) and s.id in(3,4) then '('+a.formula+')' else a.formula end + s.sig + rtrim(b.val)
,result=case s.id when 1 then a.result+b.val when 2 then a.result-b.val when 3 then a.result*b.val when 4 then a.result/b.val end
into #2
from #1 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and (s.id<>2 or s.id=2 and a.result>=b.val)
union all
select a.aid,a.s1,a.bid,s.id s2,b.id cid,b.val c
,formula=rtrim(b.val) + s.sig + '('+a.formula+')'
,result=case s.id when 2 then b.val-a.result when 4 then b.val/a.result end
from #1 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and (s.id=2 and a.result<b.val or s.id=4 and a.result>0)
--select * from #2

--4.加入第四个数
select formula=case when a.s2 in (1,2) and s.id in(3,4) then '('+a.formula+')' else a.formula end + s.sig + rtrim(b.val)
,result=case s.id when 1 then a.result+b.val when 2 then a.result-b.val when 3 then a.result*b.val when 4 then a.result/b.val end
into #3
from #2 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and a.cid<>b.id and (s.id<>2 or s.id=2 and a.result>=b.val)
union all
select formula=rtrim(b.val) + s.sig + '('+a.formula+')'
,result=case s.id when 2 then b.val-a.result when 4 then b.val/a.result end
from #2 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and a.cid<>b.id and (s.id=2 and a.result<b.val or s.id=4 and a.result>0)

--5.选取结果并格式化
select distinct formula=replace(formula,'.000',''),result=@result
from #3
where result=@result
go
claro 2009-04-17
  • 打赏
  • 举报
回复
帮顶
lg3605119 2009-04-17
  • 打赏
  • 举报
回复
解答就加分
等不到来世 2009-04-17
  • 打赏
  • 举报
回复
50分有点少
htl258_Tony 2009-04-17
  • 打赏
  • 举报
回复
牛人.
lg3605119 2009-04-17
  • 打赏
  • 举报
回复
偶已经加分到100 这是我发贴的最高分
lg3605119 2009-04-17
  • 打赏
  • 举报
回复
蓉儿 树上的鸟儿辛苦了
lg3605119 2009-04-16
  • 打赏
  • 举报
回复
没人解答 自己UP下
dj3688 2009-04-16
  • 打赏
  • 举报
回复
you_tube 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liangCK 的回复:]
太牛了吧..
[/Quote].
lg3605119 2009-04-16
  • 打赏
  • 举报
回复
期待高手继续解答
lg3605119 2009-04-16
  • 打赏
  • 举报
回复
期待简单点的答案
belsonB5 2009-04-16
  • 打赏
  • 举报
回复
帮我看看这个问题好不好!谢谢了!

http://topic.csdn.net/u/20090408/15/280de90a-87f2-440d-8049-72b138d0a563.html
conan304 2009-04-16
  • 打赏
  • 举报
回复
太牛了,佩服
-狙击手- 2009-04-15
  • 打赏
  • 举报
回复


加载更多回复(18)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧