Board logo

标题: [数值计算] 【已解决】求助批处理计算相加结果是84,88,99,110的四个数? [打印本页]

作者: wangjmh    时间: 2009-3-28 18:17     标题: 【已解决】求助批处理计算相加结果是84,88,99,110的四个数?

有四个数,其中任意三个数相加,所得的和分别是84,88,99,110,求这四个数?

我自己写了个代码但运行起来不正确,而且此算法太浪费资源,请大侠们帮我改正代码,并给出一个效率更高的代码
@echo off&&setlocal ENABLEDELAYEDEXPANSION
for /l %%a in (1 1 110) do (
        for /l %%b in (1 1 110) do (
                for /l %%c in (1 1 110) do (for /l %%d in (1 1 110) do(
                        set/a result=%%a+%%b+%%c
                        set/a result1=%%b+%%c+%%d
                        set/a result2=%%a+%%b+%%d
                        set/a result3=%%a+%%c+%%d
                        if "!result!"==84 && "!result1!"==88 &&"!result2!"==99 &&"!result3!"==110 (
                                echo %%a && echo %%b && echo %%c &&echo &&d
                        )
                )
        )
)
)
pause

[ 本帖最后由 wangjmh 于 2009-3-30 21:27 编辑 ]
作者: namejm    时间: 2009-3-28 18:52

  如果四个数不允许有任何两个重复,那么,可以缩小for循环的范围:
  1、最小值:84-(1+2+3)=78;
  2、最大值:110-(1+2+3)=104;

  因此,for /l 嵌套的起止值不用从1到110,只需从78到104即可,可以大为减少循环次数。
作者: Batcher    时间: 2009-3-28 18:58

注意语法
  1. if !result!==84 (
  2.   if !result1!==88 (
  3.     if !result2!==99
  4.       if !result3!==110 (
  5.         echo.%%a %%b %%c %%d
  6.       )
  7.     )
  8.   )
  9. )
复制代码

作者: batman    时间: 2009-3-28 18:59

分析:
a+b+c=84 a+b+d=88 a+c+d=99 b+c+d=110
(a+b+c)+(a+b+d)+(a+c+d)+(b+c+d)=3*(a+b+c+d)
代码(小学版):
  1. @echo off
  2. set /a num=84+88+99+110,num/=3
  3. set /a a=num-110,b=num-99,c=num-88,d=num-84
  4. echo 四数分别为:%a% %b% %c% %d%
  5. pause>nul
复制代码

作者: Batcher    时间: 2009-3-28 19:04

  1. @echo off
  2. set /a sum=(84+88+99+110)/3
  3. set /a num_4=sum-84
  4. set /a num_3=sum-88
  5. set /a num_2=sum-99
  6. set /a num_1=sum-110
  7. set num_
  8. pause
复制代码

作者: Batcher    时间: 2009-3-28 19:05

汗水,比4楼晚了5秒钟。
作者: youxi01    时间: 2009-3-28 21:08

都是这么聪明的?
我看了好一会,才看明白是怎么回事...

不过,现在的年轻人真是不厚道,直接运算出结果了
违背了LZ的初衷...
作者: defanive    时间: 2009-3-28 21:14

这个不素小学的问题么,相加求和。。。
作者: Lumiere    时间: 2009-3-28 21:31

设四个数分别是a,b,c,d,把楼主给出的四个数字都相加的话就得到
3(a+b+c+d)=84+88+99+110,这样得到a+b+c+d的值.有了这个思路就好办了,用总和减去楼主给的四个数字,得到的就是三个里面另外一个没有相加的数字。
所以代码很简单,如下:
  1. @echo off
  2. set /a sum=(84+88+99+110)/3
  3. set /a b=sum-84,c=sum-88,d=sum-99,e=sum-110
  4. echo 四个数分别为:%b% %c% %d% %e%
  5. pause>nul
复制代码

作者: wangjmh    时间: 2009-3-28 22:00     标题: 回复 1楼 的帖子

非常感谢大家 的帮助,请大家帮助我改一下我的语法
说一下我的语法为什么错
谢谢
作者: Batcher    时间: 2009-3-28 22:03     标题: 回复 10楼 的帖子

你的意思是3楼的语法不对?
作者: wangjmh    时间: 2009-3-29 13:22

楼上的仁兄,你误解了。我只是想知道我的语法为什么会错

[ 本帖最后由 wangjmh 于 2009-3-29 13:24 编辑 ]
作者: Lumiere    时间: 2009-3-30 11:48

最简单的一个错误是三个for一个if,前面只有4个(,你后面咋就用了5个)呢?
作者: wxcute    时间: 2009-3-30 12:45

if "!result!"==84 && "!result1!"==88 &&"!result2!"==99 &&"!result3!"==110
IF 语句是不能这样用的,请查找相关教程。

IF (条件) (命令)
具体如:IF "!str!“=="GOOD" echo !str!
以上是完整的一条 IF 语句。

而&&连接连接符是用在语句之间,而不能用来断开一个完整的语句。
正确用法如下:
嵌套:IF A==B (IF B==C (echo B) echo C)
并接:(IF A==B echo B)&&(IF B==C echo C)
作者: wangjmh    时间: 2009-3-30 21:14

非常感谢大家 的指点!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2