Board logo

标题: [讨论][探讨] 用批处理作趣味数学题 [打印本页]

作者: zouzhxi     时间: 2006-11-12 08:20    标题: [讨论][探讨] 用批处理作趣味数学题

1、求水仙花数。(水仙花数是这样的数字:这个数各个数位上数字的立方和等于该数。比如 153=1*1*1+5*5*5+3*3*3)
解决方案:4F

2、有四个数,其中任意三个数相加,所得的和分别是84,88,99,110,求这四个数?
解决方案:11F、

3、赵姑娘的岁数有以下特点:
  ①. 它的3次方是一个四位数,而4次方是一个六位数;
  ②. 这四位数和六位数正好是0到9这十个数字组成.
  问,这个数应该是什么数?
解决方案:12F


4、排一本辞典的页码共用了4889个数字。这本辞典共有多少页? 答案:1499
解决方案:15F

5、阿聪说他这次去西北看见一群骆驼,共有23个驼峰,60只脚。请问单、双峰骆驼各多少只?
解决方案:15F

6、有一个五位奇数,将这个五位奇数中的所有2都换成5,所有5也都换成2,其他数保持不变,得到一个新的五位数,若新五位数的一半仍比原五位数大1,那么原五位数是多少?
解决方案:23F、26F

7、五个连续自然数的和分别能被2、3、4、5、6整除,求满足此条件的最小的一组数。
解决方案:24F

8、我是个三位数,其中有一个数字是"3",还有一个数字是"1",另一个数字是未知数。如果把"3"变成"4"、把"1"变成"3",那么,原来的我将比假设后的我的一半还少"9"。你知道原来是个什么数?
解决方案:30F、

9、农夫琼斯对他老婆说:"喂,玛丽亚,如果照我的办法,卖掉75只小鸡,那么咱们的鸡饲料还能维持20夭。然而,假使照你的建议,再买进100只小鸡的话,那么鸡饲料将只够维持15天。"
"啊,亲爱的,"她答道,"那我们现在有多少只小鸡呢?"
问题就在这里了,他们究竟有多少只小鸡?
解决方案:30F

10、在所有的5位数当中,只包含两个3的数字有多少个?
解决方案:30F

11、将17分成几个自然数的和,求这几个自然数的最大乘积是多少?
解决方案:31F

12、将自然数2、3......乘到一起,它们的积的最后6位数恰好都是0,最后一个自然数最少可能是几?
解决方案:31F

13、被除数、除数和商三个数的和是181,商是12,求被除数。
解决方案:31F

14、商店里有六箱货物,分别重15、16、18、19、20、31千克,两个顾客买走了其中五箱.已知一个顾客买的货物重量是另一个顾客的2倍,那么,商店剩下的一箱货物重量是多少千克?
解决方案:33F

15、一个数除以3的余数是2,除以5的余数是1,则这个数除以15的余数是多少?
解决方案:35F

16、
    ①.  p是质数,且p×p+1也是质数。求2006×p。解决方案:暂无
    ②.  2006个2的乘积除以7的余数是多少。解决方案:40F

17、传说在印度的一个圣庙里安放着一个黄铜板,板上插着三根宝石针,在第一根宝石针上,从下到上依次穿着从大到小的64片中心有孔的金片,圣庙里的僧人按下面规则移动金片:每次只能移动一片,而且小片永远要放在大片的上面。当时传说,当64片金片都移动到另一根宝石针上的时候,世界将在一声霹雳中毁灭。把64片金片移动到另一根宝石针上,需要移动多少次呢?这是一个非常大的数字!
答案:18446744073709551615
解决方案:42F

18、有十张币值分别为1分、2分、5分、1角、2角、5角、1元、2元、5元、10元的人民币,能组成多少种不同的币值?
解决方案:43F

19、两个十位数3333333333和9999999999的乘积里有几个数字是偶数? (只用乘减法能做吗?)
解决方案:65F

20、甲、乙、丙三个互相咬合的齿轮,若使甲轮转5圈时,乙轮转7圈,丙轮转2圈,这三个齿轮齿数最少应分别是多少齿?
解决方案:66F

21、有两盆水,一冷一热。冷水盆里有个温度计,用一个小杯子去弄一杯热水倒到冷水里,发现温度上升了 5 度,再倒一杯热水进去,又上升了 3 度,问再倒一杯下去,会再上升几度?(此题由NaturalJ0提供)
解决方案:76F

22、求勾股数
解决方案:8F、9F

#23 ?
称珠子=
有243颗外形一模一样的珠子,其中有一颗稍重一点。用一架没有砝码的天平,至少称几次才能找出这颗珠子来?

#24 ?
坐井观天的青蛙=
坐井观天的那只青蛙一天突然心血来潮,想到外面的世界去看看,井深九尺,青蛙一次只能蹦三尺高,如果这样青蛙要蹦几次才能跳出井口呢?

#25 ?
鸡狗各多少=
小鸡、小狗七十九,二百只脚在地上走,想一想,算一算,多少只鸡?多少只狗?

#26 ?
大、小和尚各有几=
这是一道古算题:百个和尚百个粑,大和尚每人粑四个,小和尚四人一个粑,大、小和尚各有几?

#???
新题目
http://www.cn-dos.net/forum/view ... id=Y7sfAE#pid220052




——————————————分割线———————————————


***********************************
                     版务日志
***********************************
操   作:      主题加精
执行人:      3742668
原   因:      感谢zouzhxi和youxi01以及楼下各
                 位带来如此精彩的一贴。"共同学
                 习,共同进步“的宗旨在本贴中体
                 现得淋漓尽致。
说   明:      由于目前并没有一个明确的加精依
                据,所以如果对此次操作持怀疑态度
                的朋友可以跟贴指出,或者于站内
                的消息系统留言说明。
***********************************


[ Last edited by zouzhxi on 2007-8-21 at 12:16 PM ]
附件 1: 用批处理作趣味数学题(问题加代码).txt (2006-11-19 02:13, 19.94 K, 下载附件所需积分 1点 ,下载次数: 122)
附件 2: 用批处理作趣味数学题(问题加代码).txt (2006-11-22 00:30, 20.16 K, 下载附件所需积分 1点 ,下载次数: 96)

作者: 不得不爱     时间: 2006-11-12 08:46
符合勾股定律的数有很多啊,你怎么说(在数字1000000000000以内只有一个5*5=3*3+4*4这样一组数)啊?
比如:10*10=6*6+8*8等

[ Last edited by 不得不爱 on 2006-11-11 at 08:59 PM ]
作者: zouzhxi     时间: 2006-11-12 08:59
是的,
运行的时候,我等了半小时,,,
得出的就是只有这一组,其他的,都是不相等的...

比如:6*6 ≠4*4+5*5
作者: lxmxn     时间: 2006-11-12 09:45

  在3位整数里面,只有153、370、371、407是符合水仙花数特点的。

  请大家测试这个代码:
@echo off&&setlocal ENABLEDELAYEDEXPANSION
for %%a in (1 2 3 4 5 6 7 8 9) do (
        for %%b in (0 1 2 3 4 5 6 7 8 9) do (
                for %%c in (0 1 2 3 4 5 6 7 8 9) do (
                        set/a result=%%a*%%a*%%a+%%b*%%b*%%b+%%c*%%c*%%c
                        if "!result!"=="%%a%%b%%c" (
                                echo %%a%%b%%c是水仙花数!
                        )

                )
        )
)
pause

作者: electronixtar     时间: 2006-11-12 09:46
原来批处理的算法也如此有趣
作者: namejm     时间: 2006-11-12 11:49
  lxmxn 在4F的代码还可以精简一下,把 for %%a 换成 for /l 计数循环就可以省略掉数字的列举了。
作者: zh159     时间: 2006-11-12 12:12
4位数:1634、8208、9474
5位数:54748、92727、93084

^_^
作者: namejm     时间: 2006-11-12 12:17
  勾股数的算法如下,奇怪的是,同是用 for /l 计数循环,计算水仙花数的速度非常快,而计算勾股数就非常的慢了:
@echo off
echo.
echo 100以内的勾股数如下:
echo.
setlocal enabledelayedexpansion
for /l %%i in (1,1,100) do (
    for /l %%j in (1,1,100) do (
        for /l %%k in (1,1,100) do (
            set /a a=%%i*%%i
            set /a b=%%j*%%j
            set /a c=%%k*%%k
            set /a sum=!a!+!b!
            if !sum! equ !c! echo %%i %%j %%k
        )
    )
)
pause

作者: youxi01     时间: 2006-11-13 00:56
TO:8楼斑竹:“勾股数的算法如下,奇怪的是,同是用 for /l 计数循环,计算水仙花数的速度非常快,而计算勾股数就非常的慢了:”你的计算量是前面的一千倍了,当然速度要慢的多。
     可以对代码稍做修改,不仅可以剔除相同项(如:3 4 5和4 3 5)而且可以大大提高运行效率:
@echo off
echo.
echo 100以内的勾股数如下:
echo.
setlocal enabledelayedexpansion
for /l %%i in (1,1,100) do (
    for /l %%j in (%%i,1,100) do (
        for /l %%k in (%%j,1,100) do (
            set /a a=%%i*%%i
            set /a b=%%j*%%j
            set /a c=%%k*%%k
            set /a sum=!a!+!b!
            if !sum! equ !c! echo %%i %%j %%k
        )
    )
)
pause
[ Last edited by youxi01 on 2006-11-16 at 11:41 PM ]
作者: namejm     时间: 2006-11-13 01:11
  呵呵,没有考虑到剔除相同的结果,确实会使得计算量大为增加。
作者: zouzhxi     时间: 2006-11-13 02:26
我算的勾股数这样的:5*5=4*4+3*3是一组连继数字

  Quote:
另一题:
有四个数,其中任意三个数相加,所得的和分别是84,88,99,110,求这四个数?
我的方法是这样的,写出来给你们看,不要笑呀.
@ECHO OFF
echo.
setlocal enabledelayedexpansion
SET A=84
SET B=88
SET C=99
SET D=110
SET /A ABCD=A+B+C+D
SET /A SUM=ABCD/3
SET /A NO1=SUM-A
SET /A NO2=SUM-B
SET /A NO3=SUM-C
SET /A NO4=SUM-D
ECHO.
ECHO.NO1^=%NO1%
ECHO.NO2^=%NO2%
ECHO.NO3^=%NO3%
ECHO.NO4^=%NO4%
PAUSE
你们还有什么简单点的法子!!!!

再来一题:

  Quote:
赵姑娘的岁数有以下特点:
1. 它的3次方是一个四位数,而4次方是一个六位数;
2. 这四位数和六位数正好是0到9这十个数字组成.
问,这个数应该是什么数?

[ Last edited by zouzhxi on 2006-11-13 at 02:28 AM ]
作者: youxi01     时间: 2006-11-13 08:04
该小女子芳龄18。献丑了:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (10 1 30) do (
::清空变量
     set flag=
     for /l %%a in (0 1 9) do set %%a=
::取得立方和四次方
     set /a cube=%%i*%%i*%%i
     set /a s=!cube!*%%i
     if !cube! geq 1000 if !cube! lss 10000 (
         if !s! geq 100000 if !s! lss 1000000 (
            set num=!s!!cube!
            call :test !num!
            if not defined flag echo %%i !num!
       )
    )
)

pause>nul
:test
for /l %%a in (0 1 9) do (
      set var=%1
::将参数的第一个数字赋值给var_;检查变量值!var_!是否已经被作为变量被定义。
      set var_=!var:~%%a,1!
      if defined !var_! set flag=1 & goto :eof
      set !var_!=A
)
作者: lxmxn     时间: 2006-11-13 09:57

  强啊~

作者: zouzhxi     时间: 2006-11-13 10:06
再来一条,

  Quote:
    排一本辞典的页码共用了4889个数字。这本辞典共有多少页?

    答案:1499。



  Quote:
阿聪说他这次去西北看见一群骆驼,共有23个驼峰,60只脚。请问单、双峰骆驼各多少只?

闪人,去吃饭了...呵呵...星期一来逛...

[ Last edited by zouzhxi on 2006-11-13 at 10:10 AM ]
作者: youxi01     时间: 2006-11-13 12:15
一、
@echo off
set /a t_num=0
setlocal enabledelayedexpansion

echo 正在检测数据.....
for /l %%i in (1 1 4889) do (
    if !t_num! lss 4889 (
         if %%i lss 10 set /a t_num+=1
         if %%i geq 10 if %%i lss 100 set /a t_num+=2
         if %%i geq 100 if %%i lss 1000 set /a t_num+=3
         if %%i geq 1000 set /a t_num+=4
      )  else set /a num=%%i-1 & goto :exit
)
:exit
echo 要求的数为:%num%
pause>nul

二、
@echo off
set /a F_num=23
set /a J_num=60/4

setlocal enabledelayedexpansion
for /l %%i in (1 1 %J_num%) do (
   set /a S_num=%%i
   set /a B_num=%J_num%-%%i
   set /a num=!S_num!+2*!B_num!
   call :test !num! !S_num! !B_num!
)
pause>nul

:test
   if %1 EQU %F_num% echo 可能的组合为:单峰数目=%2 双峰数目=%3
   goto :eof
作者: ccwan     时间: 2006-11-13 21:08
不错。对算法有研究。
作者: kennyfan     时间: 2006-11-13 22:08
哇..深入...学习ing!!!
作者: zouzhxi     时间: 2006-11-15 00:26
为了促进算法研究,,,呵呵。。

  Quote:
有一个五位奇数,将这个五位奇数中的所有2都换成5,所有5也都换成2,其他数保持不变,得到一个新的五位数,若新五位数的一半仍比原五位数大1,那么原五位数是多少?


作者: redtek     时间: 2006-11-15 00:42
哈哈……有意思~:)
可以开批处理与数据结构算法专版了~:)
作者: zouzhxi     时间: 2006-11-15 02:25


  Quote:
五个连续自然数的和分别能被2、3、4、5、6整除,求满足此条件的最小的一组数。


作者: Michale     时间: 2006-11-15 03:56
不错~~看了那么的处理~~觉得楼上的几个处理蛮漂亮的~~值得大家一起来研究研究~~谢谢大家~~~
作者: namejm     时间: 2006-11-15 06:36
  建议 zouzhxi 把所有的问题都集中在顶楼,以 序号+内容 的格式列出来,每解决一个,就在这个序号后做个标记或者说明,这样就能让大家看到这个帖子都有哪些有意思的话题。
作者: youxi01     时间: 2006-11-15 07:24
终于又回来了!
回18楼,答案是:29995。
给出的测试代码:
@echo off & echo 正在检测数据...
setlocal enabledelayedexpansion
for /l %%a in (0 1 9) do (
   for /l %%b in (0 1 9) do (
     for /l %%c in (0 1 9) do (
       set/a Fnum=2%%a%%b%%c5
       set Bnum=!Fnum:5=A!
       set Bnum=!Bnum:2=5!
       set/a Bnum=!Bnum:A=2!
       set/a Fnum_=2*!Fnum!+2
       if !Bnum! EQU !Fnum_! echo !Fnum!
       )))
echo 检测完毕!
pause>nul
说明:该程序在XP pro sp2下测试通过。
解决这个问题,首先我们要明确这个数字结尾必须是5,因为只有这样,才可以在转化后才是偶数,才可以被2整除;而且首位数字必须是2......

[ Last edited by youxi01 on 2006-11-16 at 11:38 PM ]
作者: youxi01     时间: 2006-11-15 07:46
答20楼:答案是10 11 12 13 14
@echo off
echo 正在检测数据....
setlocal enabledelayedexpansion
for /l %%i in (1 1 10000) do (
   set /a flag=0
   set /a num=5*%%i+10
   set /a num1=!num!%%4
   set /a num2=!num!%%5
   set /a num3=!num!%%6
   for %%a in (!num1! !num2! !num3!) do (
      if %%a NEQ 0 set /a flag=1
    )
   if !flag! EQU 0 set /a num=%%i & goto :exit
)
:exit
for /l %%i in (0 1 4) do (
   set /a num%%i=%num%+%%i
)
echo 要求的连续的5个自然数为:%num0% %num1% %num2% %num3% %num4%
pause>nul
xp pro sp2下测试通过。

[ Last edited by youxi01 on 2006-11-16 at 11:38 PM ]
作者: zouzhxi     时间: 2006-11-15 08:10
应namejm的要求:

  Quote:
#序号 !解决 ?未解决

#01 !
求水仙花数?

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

#03 !
赵姑娘的岁数有以下特点:
  1. 它的3次方是一个四位数,而4次方是一个六位数;
  2. 这四位数和六位数正好是0到9这十个数字组成.
  问,这个数应该是什么数?

#04 !
排一本辞典的页码共用了4889个数字。这本辞典共有多少页? 答案:1499

#05 !
阿聪说他这次去西北看见一群骆驼,共有23个驼峰,60只脚。请问单、双峰骆驼各多少只?

#06 !
有一个五位奇数,将这个五位奇数中的所有2都换成5,所有5也都换成2,其他数保持不变,得到一个新的五位数,若新五位数的一半仍比原五位数大1,那么原五位数是多少?

#07 !
五个连续自然数的和分别能被2、3、4、5、6整除,求满足此条件的最小的一组数。

#08 !
我是个三位数,其中有一个数字是“3”,还有一个数字是“1”,另一个数字是未知数。如果把“3”变成“4”、把“1”变成“3”,那么,原来的我将比假设后的我的一半还少“9”。你知道原来是个什么数?

#09 ?
农夫琼斯对他老婆说:"喂,玛丽亚,如果照我的办法,卖掉75只小鸡,那么咱们的鸡饲料还能维持20夭。然而,假使照你的建议,再买进100只小鸡的话,那么鸡饲料将只够维持15天。"
"啊,亲爱的,"她答道,"那我们现在有多少只小鸡呢?"
问题就在这里了,他们究竟有多少只小鸡?

#10 !
在所有的5位数当中,只包含两个3的数字有多少个?

#11 !
将17分成几个自然数的和,求这几个自然数的最大乘积是多少?

#12 ?
将自然数2、3......乘到一起,它们的积的最后6位数恰好都是0,最后一个自然数最少可能是几?

#13 !
被除数、除数和商三个数的和是181,商是12,求被除数。



  Quote:
#14 ?
商店里有六箱货物,分别重15、16、18、19、20、31千克,两个顾客买走了其中五箱.已知一个顾客买的货物重量是另一个顾客的2倍,那么,商店剩下的一箱货物重量是多少千克?

#15 ?
一个数除以3的余数是2,除以5的余数是1,则这个数除以15的余数是多少?

#16 ?
    1.  p是质数,且p×p+1也是质数。求2006×p。
    2.  2006个2的乘积除以7的余数是多少。

[ Last edited by zouzhxi on 2006-11-15 at 09:39 PM ]
作者: namejm     时间: 2006-11-15 08:10


  Quote:
Originally posted by youxi01 at 2006-11-14 18:24:
解决这个问题,首先我们要明确这个数字结尾必须是5,因为只有这样,才可以在转化后才是偶数,才可以被2整除;而且首位数字必须是2......

  23F的思路有缺陷,因为我们要做的,就是用代码来模拟题意,如果能直接推出某些条件,则可以充分利用这些条件;如果需要经过两步以上的推理才能得出的条件,最好不要使用,而应交给代码来处理;否则,既然经过两步推理得出的条件可以使用,那么,三步的呢?四步的呢?N步的呢?最后一步不就包含在第N步中么?那样的话,我们完全可以把需要经过N步才能得出的结论直接写出来,从而完全抛弃代码——虽然最后你的结果是正确的,但是建议不要这样做。

  在23F的基础上,给出一个解决18F的问题、尽量模拟题意的代码(速度很慢):
@echo off
setlocal enabledelayedexpansion
for /l %%i in (10001,2,99999) do (
    set num=%%i
    set num=!num:5=a!
    if not "!num!"=="%%i" (
        set num_tmp1=!num!
        set num=!num:2=5!
        if not "!num!"=="!num_tmp1!" (
            set num=!num:a=2!
            set /a num_tmp2=2*%%i+2
            if !num! equ !num_tmp2! echo %%i
        )
    )
)
pause
  再给出一个比较快一点的代码:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (10005,5,99995) do (
    set num=%%i
    set num=!num:5=a!
    if not "!num!"=="%%i" (
        set num_tmp1=!num!
        set num=!num:2=5!
        if not "!num!"=="!num_tmp1!" (
            set num=!num:a=2!
            set /a num_tmp2=2*%%i+2
            if !num! equ !num_tmp2! echo %%i
        )
    )
)
pause
  23F的代码可精简为:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (20005,5,29995) do (
    set num=%%i
    set num=!num:5=a!
    set num=!num:2=5!
    set num=!num:a=2!
    set /a num_tmp=2*%%i+2
    if !num! equ !num_tmp! echo %%i
)
pause
[ Last edited by namejm on 2006-11-15 at 12:57 PM ]
作者: youxi01     时间: 2006-11-15 08:18
对于楼上的斑竹的  “因为我们要做的,就是用代码来模拟题意,如果能直接推出某些条件,则可以充分利用这些条件;如果需要经过两步以上的推理才能得出的条件”  的说法,在下不敢苟同!

我曾经用(纯)批处理写过一篇求100000之内的素数的问题,如果根据楼上的说法,模拟题意的话,那写出的代码运行效率实在是不敢恭维!

对于一些推导性的结论,特别是比较快速的可以推导的结论,我觉得就都可以运用。
作者: namejm     时间: 2006-11-15 08:31
  呵呵,不敢苟同的做法是对的,因为我没有说出我的前提条件:当我们要研究某些通用算法的时候,应该尽量模拟题意写代码;如果是写应用型的脚本,基于效率优先的原则,则可以充分利用一切可以正确推导出来的条件——在这里之所以提出尽量模拟的说法,是因为我们在这里主要讨论的是通用算法。当然,并不意味着要排斥技巧性非常强的代码。
作者: lxmxn     时间: 2006-11-15 09:27

  在用批处理玩数字游戏的时候,要注意数字的范围哦,超过就会溢出了。

  -2147483648——2147483647        (WINDOWS XP SP2 @ CMD Shell)

作者: youxi01     时间: 2006-11-15 12:14
不错,好多问题了!先回答几题!
第八题:
@echo off
rem 经推算,首位数字必须为1,(除非未知数为1,为1的情况在第一个for中也处理了)
setlocal enabledelayedexpansion
for /l %%i in (0 1 9) do (
   set /a Fnum=1%%i3
   set /a Bnum=3%%i4
   set /a num=!Bnum!/2-9
   if !Fnum! EQU !num! echo !Fnum!)

for /l %%i in (0 1 9) do (
   set /a Fnum=13%%i
   set /a Bnum=34%%i
   set /a num=!Bnum!/2-9
   if !Fnum! EQU !num! echo !Fnum!)
pause>nul
第九题:
@echo off
rem 小鸡的只数至少有76只:

setlocal enabledelayedexpansion
for /l %%i in (76 1 10000) do (
   set /a Fnum=%%i*20-75*20
   set /a Bnum=%%i*15+100*15
  if !Fnum! EQU !Bnum! echo 小鸡的只数为:%%i & goto :exit)
:exit
pause>nul
第十题:来一个比较巧一点的办法:(效率可能相对要高,没测试!)
@echo off
echo 正在检测数据........
setlocal enabledelayedexpansion
set /a flag=0
for /l %%i in (10000,1,99999) do (
   set num=%%i
rem 前面加个1是为了防止类似30820的特殊情况。
   set /a num=1!num:3=!
   if !num! lss 2000 if !num! gtr 200 set /a flag+=1)
echo %flag%
echo 检测完毕!
pause>nul
[ Last edited by youxi01 on 2006-11-16 at 11:41 PM ]
作者: youxi01     时间: 2006-11-15 14:47
=============================
第11题稍微难一点。利用高中的数学知识可以证明,凡是大于等于4的数,它都可以这样的两个数,它们

的和与该数相等,乘积要大于等于该数。根据这样的推论,所有的数最后都会拆成这样的形式:

A*A*A*A....A为2或者3(因为只有2和3不能拆了,最后剩下的肯定只有2和3)。所以我们就可以得到下面

的代码:(答案是486,我不知道对不对^-^)
@echo off
setlocal enabledelayedexpansion
set num=17
set /a Cnum=%num%/3
set /a Rnum=%num%%%2
set /a Tnum=0
   for /l %%i in (%Rnum% 2 %Cnum%) do (
      set num_=1
      set /a num_tem=%num%/2-%%i*3/2
      for /l %%a in (1 1 %%i) do (
          set /a num_*=3)
      for /l %%b in (1 1 !num_tem!) do (
          set /a num_*=2)
      if !num_! gtr !Tnum! set /a Tnum=!num_!
)
echo !Tnum!
pause>nul
==================================
第12题,貌似比较简单,实则有点难..
@echo off
echo 正在检测数据........
setlocal enabledelayedexpansion
set /a num=1
set /a flag=0
for /l %%i in (2 1 10000) do (
   call :test %%i
   if !flag! equ 5 set /a num=%%i & goto :exit)

:exit
echo.
echo 最小的自然数为:!num!
echo.
echo 检测完毕!
pause>nul

:test
   set /a num=!num!*%1
   for /l %%i in (1 1 5) do (
      if !num:~-1! EQU 0 (set /a flag+=1 & set /a num=!num:~0,-1!) else (
          set /a num=!num:~-1! & goto :eof))
=============================================
第13题
@echo off
echo 正在检测数据........
setlocal enabledelayedexpansion

for /l %%a in (90 1 180) do (
     for /l %%b in (1 1 %%a) do (
        set /a num=%%a %% %%b
        if !num! EQU 0 (
           set /a num=%%a/%%b
           set /a num_=!num!+%%a+%%b
           if !num_! EQU 181 echo 这样的数有,被除数:%%a 除数:%%b 商:!num!
         )
     )
)
echo.
echo 检测完毕!
pause>nul
[ Last edited by youxi01 on 2006-11-16 at 11:33 PM ]
作者: zouzhxi     时间: 2006-11-15 21:42
题目已经更新...
作者: youxi01     时间: 2006-11-16 02:44
先问问楼主:1、第十二题不是解决了吗?
                  2、第十一题的答案是否正确?

对于十四题,可能口算还更快,因为只有20,它比3的倍数多了2,所以答案是它(可以证明)!
程序代码为:
@echo off
set /a num=15+16+18+19+20+31
set Tnum=15 16 18 19 20 31
setlocal enabledelayedexpansion
rem ==========================
rem 第十四题:
for %%i in (15 16 18 19 20 31) do call :test %%i
echo 剩下的一包质量为:!result1!
echo 质量比较少的两包质量为:!result2! !result3!
pause>nul

:test
   set /a num_tmp=%num%-%1
   set /a Rnum=!num_tmp! %% 3
   if !Rnum! NEQ 0 goto :eof
   set Tnum_=!Tnum:%1 =!
   set /a Snum=!num_tmp!/3
   for %%a in (!Tnum_!) do (
       set /a Rt=!Snum!-%%a
       echo !Tnum_! | find "!Rt!" >nul 2>nul && (
          set result3=%%a
          set /a result2=!Rt!
          set /a result1=%1))
[ Last edited by youxi01 on 2006-11-16 at 11:34 PM ]
作者: redtek     时间: 2006-11-16 03:11
[建议]zouzhxi兄将1楼索引贴中其索引内容的题标下面加入解题人楼号、链接,
    以备论坛访问者看到第1楼第1贴时,几秒钟内可迅速了解题目索引。
    并快速可以点击链接进入其相应的索引页面(因有楼号提示,可快速找到)。
    这对将来论坛重要、优秀等资源的索引、查找、参考、交流和别转载都起着非常方便、有效的作用~:)
  #01 !
  求水仙花数?

  *************** 建议在这里加入不同解题人的楼号与URL链接  *****
  如果有多个解题人,就加入多个URL不同页面的链接以及楼号:)
[建议]使用批处理方案解决和模拟数学算法以及数据结构相关的内容,
    其本就身含具了一定量的批处理应用以及运算技巧。
    
    但由于其数据结构以及算法的应用是使用批处理运算模拟完成的,
    还含有批处理应用的一些技巧和使用经验,所以建议应适量的加入中文注解,
    以备对数学和批处理希望再提高的网友参考与学习~:)

    而且,这也是批处理中较“少见”的关于数学内容的知识贴~:)
    所以建议精异求精,为增加论坛亮点和有论坛影响性的贴子传播再架高基础~:)

[ Last edited by redtek on 2006-11-16 at 03:19 AM ]
作者: youxi01     时间: 2006-11-16 05:36
回楼主:12题代码运行结果确实为:25,题目已解决!我是想问第11题的答案是不是486?!

==============
第15题
@echo off
setlocal enabledelayedexpansion
echo 在1~10000内,这样的数字以及除以15的余数分别为:
for /l %%i in (1 1 10000) do (
   set /a num1=%%i %% 3
   set /a num2=%%i %% 5
   if !num1! EQU 2 if !num2! EQU 1 (
       set /a Result=%%i
       set /a num=!Result! %% 15
       echo 数字:!Result!       余数:!num!
   )
)

pause>nul
[ Last edited by youxi01 on 2006-11-16 at 11:34 PM ]
作者: zouzhxi     时间: 2006-11-16 05:41
回楼上:
是的,
分解成:3×3×3×3×3×2=486
这个乘积是最大的。

你12F的代码结果:


[ Last edited by zouzhxi on 2006-11-16 at 05:51 AM ]
作者: youxi01     时间: 2006-11-16 05:54
1、对于16题的第一小题,我想的话,如果还写代码的话就太浪费了:
     很容易证明P必须是偶数且又必须是质数,所以只能为2
2、至于第二小题,我看答案应该是4,利用高中的数列和排列组合的相关知识就可以搞定。如果纯粹写针对这个问题的代码那实在是....正在努力写一个具有一定通用性的代码
作者: youxi01     时间: 2006-11-16 06:01
Re 36F,不好意思,12题的答案贴错了,贴到测试时的代码了,看更新后的代码!
作者: zouzhxi     时间: 2006-11-16 06:44
问题已经更新...
作者: youxi01     时间: 2006-11-16 23:14
===========================================
16.1在这里不写代码了,因为没什么好写的^_^,答案应该为5012
下面贴一贴 16.2的代码:
@echo off
setlocal enabledelayedexpansion
for %%i in (2 3 5 6 7 9 10 15 17 31 33 63 65) do (
   set /a tmp=1
   set /a Res=1
   call :test %%i
   echo 2^^^^2006除以%%i的余数为:!Res!)
pause>nul

::处理偶数
:test
  if %1 GTR 2 (
    set /a var=%1 %% 2
    if !var! EQU 0  (
        set /a num=%1/2
        call :test !num!) else call :test1 %1) else set Res=0
    goto :eof

:test1
    for /l %%i in (1 1 10) do (
       set /a tmp*=2
       set /a Rnum=%1 %% 4
       if !tmp! GEQ %1 (
          if !Rnum! EQU 3 (
             set /a Inum=%%i
             set /a Inum_=2006 %% !Inum!
             for /l %%a in (0 1 !Inum_!) do set /a Res*=2
             set /a Res=!Res!/2
             goto :eof)
          set /a Inum=%%i-1
          set /a Inum_=2006 %% !Inum!
          for /l %%a in (0 1 !Inum_!) do set /a Res*=2
          set /a Res=%1-!Res!/2   
          goto :eof
          ))
[ Last edited by youxi01 on 2006-11-16 at 11:35 PM ]
作者: namejm     时间: 2006-11-16 23:18
  建议 youxi01 把代码部分用 [code] 和 [/code] 括起来,一来便于分清代码部分和非代码部分,二来也方便别人的复制粘贴。
作者: youxi01     时间: 2006-11-16 23:28
===========================================
17题:数学奥赛题,很容易知道答案是2^64-1,重要的问题是如何计算出2^64这个极其庞大的数字,直接计算肯定是行不通的了,那只好采取 “曲线救国” 的办法。我把我采用的办法叫做 “钟表式分段计算法”,如果不是原创,请恕我卤莽!

以下代码是将数据分成了6段,每段6位数字来分别保存。它的基本原理是:当最后一段数据在乘以2以后,如果它的值大于1000000,则进位,将进位的数据加到前一段数据上,依次类推。该段代码目前支持200个2连续相乘,当然你可以“改装”,可以计算更庞大的数字。

1、以下是计算2^n的代码:
@echo off
setlocal enabledelayedexpansion

::初始化每段数据;
for /l %%i in (1 1 5) do set /a num%%i=0
set /a num6=1

for /l %%i in (1 1 64) do (
   rem ================================================
   rem 初始化 进位数据 和 分段数据的计算公式(就是乘以2)

   for /l %%i in (1 1 5) do (
     set /a num%%i_=0
     set /a num%%i*=2)
   set /a num6*=2
   rem ================================================

  for /l %%a in (6 -1 1) do (
     rem 每段数据保存一个6位数;  
     if !num%%a! GTR 1000000 (
        set /a Inum=%%a-1
        set /a tmp=!num%%a!
        rem ========================================================================
        rem 前面这个1是从前面的数据段“借”来的;前面加个1是为了防止set /a test=0003
        rem 类似情况的出现!

        set /a num%%a=1!tmp:~-6!
        rem ========================================================================
        
        rem 前面一段的数据加上后面一段数据的进位数再减1,因为有个1被“借”掉了!
        set /a num!Inum!+=!tmp:~0,-6!-1
        )
     )
)
   rem ===================================================================
   rem 扫尾工作,因为前面为了除错,采用了“借”数据的办法,下面就给它还原!

   for /l %%a in (6 -1 4) do (
        set /a Inum=%%a-1
        set /a tmp=!num%%a!
        set num%%a=!tmp:~1!
        set /a num!Inum!+=!tmp:~0,1!)
    rem ===================================================================
    echo %num1% %num2% %num3% %num4% %num5% %num6%
   
pause>nul
2、要完全完成题目的要求,请拷贝以下代码!
@echo off
setlocal enabledelayedexpansion

::初始化每段数据;
for /l %%i in (1 1 5) do set /a num%%i=0
set /a num6=1

for /l %%i in (1 1 64) do (
   rem ================================================
   rem 初始化 进位数据 和 分段数据的计算公式(就是乘以2)

   for /l %%i in (1 1 5) do (
     set /a num%%i_=0
     set /a num%%i*=2)
   set /a num6*=2
   rem ================================================

  for /l %%a in (6 -1 1) do (
     rem 每段数据保存一个6位数;  
     if !num%%a! GTR 1000000 (
        set /a Inum=%%a-1
        set /a tmp=!num%%a!
        rem ========================================================================
        rem 前面这个1是从前面的数据段“借”来的;前面加个1是为了防止set /a test=0003
        rem 类似情况的出现!

        set /a num%%a=1!tmp:~-6!
        rem ========================================================================
        
        rem 前面一段的数据加上后面一段数据的进位数再减1,因为有个1被“借”掉了!
        set /a num!Inum!+=!tmp:~0,-6!-1
        )
     )
)
   set /a num6-=1
   rem ===================================================================
   rem 扫尾工作,因为前面为了除错,采用了“借”数据的办法,下面就给它还原!

   for /l %%a in (6 -1 4) do (
        set /a Inum=%%a-1
        set /a tmp=!num%%a!
        set num%%a=!tmp:~1!
        set /a num!Inum!+=!tmp:~0,1!)
    rem ===================================================================
     for %%i in (%num1% %num2% %num3% %num4% %num5% %num6%) do (
        if %%i neq 0 set Result=!Result!%%i)
    echo !Result!
   
pause>nul
[ Last edited by youxi01 on 2006-11-17 at 12:33 AM ]
作者: youxi01     时间: 2006-11-16 23:31
========================================
18题:这个纯粹就是排列组合的问题了,实际上就是用批处理来处理排列组合公式!
代码:求出来的结果是1023,不知道对不?
@echo off
setlocal enabledelayedexpansion

set /a num=1
set /a Result=0

for /l %%i in (1 1 10) do (
    call :test %%i 10
    set /a Result+=!num! & set /a num=1)
echo 币值种类有:!Result!
pause>nul

::求C(n,r);
:test start_num end_num
    set /a tmp=%2-%1+1
    for /l %%i in (%tmp% 1 %2) do set /a num*=%%i
    for /l %%i in (1 1 %1) do set /a num/=%%i
[ Last edited by youxi01 on 2006-11-16 at 11:37 PM ]
作者: zouzhxi     时间: 2006-11-16 23:55
Re 42F:
对了,
就是在数字前面多了两0,数字中间有空格,看起来不像是一个答案,
而是一组数组。。。,
可不可以把它去掉。。。

Re 43F:
一开始,我就算错了。后来才发现在最后要减去1,
我的答案一开始是:1024的
没有排除每一种组合都不选的情况。。。
答案是:1023
作者: youxi01     时间: 2006-11-17 00:34
42F贴子已经修改,如你所愿!
作者: youxi01     时间: 2006-11-17 02:32    标题: 用批处理作趣味数学题(汇总)

#序号 !解决 ?未解决

#01 !(代码由lxmxn提供)
求水仙花数?
@echo off&&setlocal ENABLEDELAYEDEXPANSION
for %%a in (1 2 3 4 5 6 7 8 9) do (
        for %%b in (0 1 2 3 4 5 6 7 8 9) do (
                for %%c in (0 1 2 3 4 5 6 7 8 9) do (
                        set/a result=%%a*%%a*%%a+%%b*%%b*%%b+%%c*%%c*%%c
                        if "!result!"=="%%a%%b%%c" (
                                echo %%a%%b%%c是水仙花数!
                        )

                )
        )
)
pause
类似题型:求勾股数?(代码由namejm提供)
@echo off
echo.
echo 100以内的勾股数如下:
echo.
setlocal enabledelayedexpansion
for /l %%i in (1,1,100) do (
    for /l %%j in (1,1,100) do (
        for /l %%k in (1,1,100) do (
            set /a a=%%i*%%i
            set /a b=%%j*%%j
            set /a c=%%k*%%k
            set /a sum=!a!+!b!
            if !sum! equ !c! echo %%i %%j %%k
        )
    )
)
pause
#02 !(代码由zouzhxi提供)
有四个数,其中任意三个数相加,所得的和分别是84,88,99,110,求这四个数?
@ECHO OFF
echo.
setlocal enabledelayedexpansion
SET A=84
SET B=88
SET C=99
SET D=110
SET /A ABCD=A+B+C+D
SET /A SUM=ABCD/3
SET /A NO1=SUM-A
SET /A NO2=SUM-B
SET /A NO3=SUM-C
SET /A NO4=SUM-D
ECHO.
ECHO.NO1^=%NO1%
ECHO.NO2^=%NO2%
ECHO.NO3^=%NO3%
ECHO.NO4^=%NO4%
PAUSE
#03 !
赵姑娘的岁数有以下特点:
  1. 它的3次方是一个四位数,而4次方是一个六位数;
  2. 这四位数和六位数正好是0到9这十个数字组成.
  问,这个数应该是什么数?

【解题思路】
取一个未知数,首先分别取得该数的立方和四次方;然后将这十个数字分别分割并都定义,最后检测从0~9是否都已经被定义,如果都被定义了,则该数满足要求,否则有重复数字,不满足要求。
@echo off
setlocal enabledelayedexpansion
for /l %%i in (10 1 30) do (
::清空变量
     set flag=
     for /l %%a in (0 1 9) do set %%a=
::取得立方和四次方
     set /a cube=%%i*%%i*%%i
     set /a s=!cube!*%%i
     if !cube! geq 1000 if !cube! lss 10000 (
         if !s! geq 100000 if !s! lss 1000000 (
            set num=!s!!cube!
            call :test !num!
            if not defined flag echo %%i !num!
       )
    )
)

pause>nul
:test
for /l %%a in (0 1 9) do (
      set var=%1
::将参数的第一个数字赋值给var_;检查变量值!var_!是否已经被作为变量被定义。
      set var_=!var:~%%a,1!
      if defined !var_! set flag=1 & goto :eof
      set !var_!=A
)
#04 !
排一本辞典的页码共用了4889个数字。这本辞典共有多少页? 答案:1499

【解题思路】
以下这个办法比较直接,直接检测数字的大小,如果小于10则为1位数字,10~99两位,....然后把所以的位数加起来即可。
@echo off
set /a t_num=0
setlocal enabledelayedexpansion

echo 正在检测数据.....
for /l %%i in (1 1 4889) do (
    if !t_num! lss 4889 (
         if %%i lss 10 set /a t_num+=1
         if %%i geq 10 if %%i lss 100 set /a t_num+=2
         if %%i geq 100 if %%i lss 1000 set /a t_num+=3
         if %%i geq 1000 set /a t_num+=4
      )  else set /a num=%%i-1 & goto :exit
)
:exit
echo 要求的数为:%num%
pause>nul
#05 !
阿聪说他这次去西北看见一群骆驼,共有23个驼峰,60只脚。请问单、双峰骆驼各多少只?

【解题思路】
首先从骆驼的脚的只数确定骆驼总的数目(除以4),然后依次检测从1到15间时候有符合题目的数据;
@echo off
set /a F_num=23
set /a J_num=60/4

setlocal enabledelayedexpansion
for /l %%i in (1 1 %J_num%) do (
   set /a S_num=%%i
   set /a B_num=%J_num%-%%i
   set /a num=!S_num!+2*!B_num!
   call :test !num! !S_num! !B_num!
)
pause>nul

:test
   if %1 EQU %F_num% echo 可能的组合为:单峰数目=%2 双峰数目=%3
   goto :eof
#06 !
有一个五位奇数,将这个五位奇数中的所有2都换成5,所有5也都换成2,其他数保持不变,得到一个新的五位数,若新五位数的一半仍比原五位数大1,那么原五位数是多少?

【解题思路】
要明确的思路是:这个特殊的数字,首位必须为2,末尾必须为5(因为原来为奇数,但后来却可以有“一半”,说明是偶数,所以可以肯定,末尾是5,后来被替换成了2。
@echo off & echo 正在检测数据...
setlocal enabledelayedexpansion
for /l %%a in (0 1 9) do (
   for /l %%b in (0 1 9) do (
     for /l %%c in (0 1 9) do (
       set/a Fnum=2%%a%%b%%c5
       set Bnum=!Fnum:5=A!
       set Bnum=!Bnum:2=5!
       set/a Bnum=!Bnum:A=2!
       set/a Fnum_=2*!Fnum!+2
       if !Bnum! EQU !Fnum_! echo !Fnum!
       )))
echo 检测完毕!
pause>nul
#07 !
五个连续自然数的和分别能被2、3、4、5、6整除,求满足此条件的最小的一组数。

【解题思路】
没有什么技巧性。利用等差数列公式,先算出5个数字的总和,然后检测看它是不是能被4、5、6整除。
@echo off
echo 正在检测数据....
setlocal enabledelayedexpansion
for /l %%i in (1 1 10000) do (
   set /a flag=0
   set /a num=5*%%i+10
   set /a num1=!num!%%4
   set /a num2=!num!%%5
   set /a num3=!num!%%6
   for %%a in (!num1! !num2! !num3!) do (
      if %%a NEQ 0 set /a flag=1
    )
   if !flag! EQU 0 set /a num=%%i & goto :exit
)
:exit
for /l %%i in (0 1 4) do (
   set /a num%%i=%num%+%%i
)
echo 要求的连续的5个自然数为:%num0% %num1% %num2% %num3% %num4%
pause>nul
#08 !
我是个三位数,其中有一个数字是“3”,还有一个数字是“1”,另一个数字是未知数。如果把“3”变成“4”、把“1”变成“3”,那么,原来的我将比假设后的我的一半还少“9”。你知道原来是个什么数?

【解题思路】
利用反证法可以知道,首位数字必须为1,所以该数的排列情况就可能为:1*3或者13*,然后去检测。
@echo off
rem 经推算,首位数字必须为1,(除非未知数为1,为1的情况在第一个for中也处理了)
setlocal enabledelayedexpansion
for /l %%i in (0 1 9) do (
   set /a Fnum=1%%i3
   set /a Bnum=3%%i4
   set /a num=!Bnum!/2-9
   if !Fnum! EQU !num! echo !Fnum!)

for /l %%i in (0 1 9) do (
   set /a Fnum=13%%i
   set /a Bnum=34%%i
   set /a num=!Bnum!/2-9
   if !Fnum! EQU !num! echo !Fnum!)
pause>nul
#09 !
农夫琼斯对他老婆说:"喂,玛丽亚,如果照我的办法,卖掉75只小鸡,那么咱们的鸡饲料还能维持20夭。然而,假使照你的建议,再买进100只小鸡的话,那么鸡饲料将只够维持15天。"
"啊,亲爱的,"她答道,"那我们现在有多少只小鸡呢?"
问题就在这里了,他们究竟有多少只小鸡?

【解题思路】
整个过程中,小鸡吃的饲料是不变的。假设有X只鸡,则应该有:(x-75)*20=(x+100)*15,然后写一个循环,看哪个数字合适?!
@echo off
rem 小鸡的只数至少有76只:

setlocal enabledelayedexpansion
for /l %%i in (76 1 10000) do (
   set /a Fnum=%%i*20-75*20
   set /a Bnum=%%i*15+100*15
  if !Fnum! EQU !Bnum! echo 小鸡的只数为:%%i & goto :exit)
:exit
pause>nul
#10 !
在所有的5位数当中,只包含两个3的数字有多少个?

【解题思路】
以下这个思路比较新颖。它的原理是:将数字中的3全部替换为空,检测方法举例说明:
如:75332 它被替换后变成752,变成了4位数以内的数字,只要检测它的大小就可以达到题目的要求。
@echo off
echo 正在检测数据........
setlocal enabledelayedexpansion
set /a flag=0
for /l %%i in (10000,1,99999) do (
   set num=%%i
rem 前面加个1是为了防止类似30820的特殊情况。
   set /a num=1!num:3=!
   if !num! lss 2000 if !num! gtr 200 set /a flag+=1)
echo %flag%
echo 检测完毕!
pause>nul
#11 !
将17分成几个自然数的和,求这几个自然数的最大乘积是多少?

【解题思路】
利用高中的数学知识可以证明,凡是大于等于4的数,它都可以拆成这样的两个数:它们的和与该数相等,乘积要大于等于该数。根据这样的推论,所有的数最后都会拆成这样的形式:A*A*A*A....A为2或者3(因为只有2和3不能拆了,最后剩下的肯定只有2和3)。
举例说明:8可以这样拆(没有3):
num1=2*2*2*2 也可以拆成(含有2个3):num2=2*3*3,然后只要比较两个num的大小就行了!
@echo off
setlocal enabledelayedexpansion
set num=17
set /a Cnum=%num%/3
set /a Rnum=%num%%%2
set /a Tnum=0
   for /l %%i in (%Rnum% 2 %Cnum%) do (
      set num_=1
      set /a num_tem=%num%/2-%%i*3/2
      for /l %%a in (1 1 %%i) do (
          set /a num_*=3)
      for /l %%b in (1 1 !num_tem!) do (
          set /a num_*=2)
      if !num_! gtr !Tnum! set /a Tnum=!num_!
)
echo !Tnum!
pause>nul
#12 !
将自然数2、3......乘到一起,它们的积的最后6位数恰好都是0,最后一个自然数最少可能是几?
@echo off
echo 正在检测数据........
setlocal enabledelayedexpansion
set /a num=1
set /a flag=0
for /l %%i in (2 1 10000) do (
   call :test %%i
   if !flag! equ 5 set /a num=%%i & goto :exit)

:exit
echo.
echo 最小的自然数为:!num!
echo.
echo 检测完毕!
pause>nul

:test
   set /a num=!num!*%1
   for /l %%i in (1 1 5) do (
      if !num:~-1! EQU 0 (set /a flag+=1 & set /a num=!num:~0,-1!) else (
          set /a num=!num:~-1! & goto :eof))
#13 !
被除数、除数和商三个数的和是181,商是12,求被除数。
@echo off
echo 正在检测数据........
setlocal enabledelayedexpansion

for /l %%a in (90 1 180) do (
     for /l %%b in (1 1 %%a) do (
        set /a num=%%a %% %%b
        if !num! EQU 0 (
           set /a num=%%a/%%b
           set /a num_=!num!+%%a+%%b
           if !num_! EQU 181 echo 这样的数有,被除数:%%a 除数:%%b 商:!num!
         )
     )
)
echo.
echo 检测完毕!
pause>nul
#14 !
商店里有六箱货物,分别重15、16、18、19、20、31千克,两个顾客买走了其中五箱.已知一个顾客买的货物重量是另一个顾客的2倍,那么,商店剩下的一箱货物重量是多少千克?

【解题思路】
可以很快的推断出的一个已知条件为:那两个顾客买走的两袋货物总质量可以被3整除,另一个顾客的可以被2整除.......
@echo off
set /a num=15+16+18+19+20+31
set Tnum=15 16 18 19 20 31
setlocal enabledelayedexpansion
rem ==========================
rem 第十四题:
for %%i in (15 16 18 19 20 31) do call :test %%i
echo 剩下的一包质量为:!result1!
echo 质量比较少的两包质量为:!result2! !result3!
pause>nul

:test
   set /a num_tmp=%num%-%1
   set /a Rnum=!num_tmp! %% 3
   if !Rnum! NEQ 0 goto :eof
   set Tnum_=!Tnum:%1 =!
   set /a Snum=!num_tmp!/3
   for %%a in (!Tnum_!) do (
       set /a Rt=!Snum!-%%a
       echo !Tnum_! | find "!Rt!" >nul 2>nul && (
          set result3=%%a
          set /a result2=!Rt!
          set /a result1=%1))
#15 !
一个数除以3的余数是2,除以5的余数是1,则这个数除以15的余数是多少?
@echo off
setlocal enabledelayedexpansion
echo 在1~10000内,这样的数字以及除以15的余数分别为:
for /l %%i in (1 1 10000) do (
   set /a num1=%%i %% 3
   set /a num2=%%i %% 5
   if !num1! EQU 2 if !num2! EQU 1 (
       set /a Result=%%i
       set /a num=!Result! %% 15
       echo 数字:!Result!       余数:!num!
   )
)

pause>nul
#16 !
    1.  p是质数,且p×p+1也是质数。求2006×p。
    2.  2006个2的乘积除以7的余数是多少。

【解题思路】
1> PxP+1是质数,所以PxP+1是奇数(2除外),则P×P为偶数,则P一定为偶数,则P=2
2> 可以将2^2006写成这样的形式:2^2006=8^668×2×2=(7+1)^668×4,再根据排列组合公式可知,2^2006除以7的余数为:4
@echo off
setlocal enabledelayedexpansion
for %%i in (2 3 5 6 7 9 10 15 17 31 33 63 65) do (
   set /a tmp=1
   set /a Res=1
   call :test %%i
   echo 2^^^^2006除以%%i的余数为:!Res!)
pause>nul

::处理偶数
:test
  if %1 GTR 2 (
    set /a var=%1 %% 2
    if !var! EQU 0  (
        set /a num=%1/2
        call :test !num!) else call :test1 %1) else set Res=0
    goto :eof

:test1
    for /l %%i in (1 1 10) do (
       set /a tmp*=2
       set /a Rnum=%1 %% 4
       if !tmp! GEQ %1 (
          if !Rnum! EQU 3 (
             set /a Inum=%%i
             set /a Inum_=2006 %% !Inum!
             for /l %%a in (0 1 !Inum_!) do set /a Res*=2
             set /a Res=!Res!/2
             goto :eof)
          set /a Inum=%%i-1
          set /a Inum_=2006 %% !Inum!
          for /l %%a in (0 1 !Inum_!) do set /a Res*=2
          set /a Res=%1-!Res!/2   
          goto :eof
          ))
#17 !
传说在印度的一个圣庙里安放着一个黄铜板,板上插着三根宝石针,在第一根宝石针上,从下到上依次穿着从大到小的64片中心有孔的金片,圣庙里的僧人按下面规则移动金片:每次只能移动一片,而且小片永远要放在大片的上面。当时传说,当64片金片都移动到另一根宝石针上的时候,世界将在一声霹雳中毁灭。把64片金片移动到另一根宝石针上,需要移动多少次呢?这是一个非常大的数字!
答案:18446744073709551615

【解题思路】根据等比数列等相关知识,可知总共需要的次数为:2^64-1,这个数字极其庞大直接计算肯定是行不通的了,那只好采取 “曲线救国” 的办法。我把我采用的办法叫做 “钟表式分段计算法”,如果不是原创,请恕我卤莽!

以下代码是将数据分成了6段,每段6位数字来分别保存。它的基本原理是:当最后一段数据在乘以2以后,如果它的值大于1000000,则进位,将进位的数据加到前一段数据上,依次类推。该段代码目前支持200个2连续相乘,当然你可以“改装”,可以计算更庞大的数字。
@echo off
setlocal enabledelayedexpansion

::初始化每段数据;
for /l %%i in (1 1 5) do set /a num%%i=0
set /a num6=1

for /l %%i in (1 1 64) do (
   rem ================================================
   rem 初始化 进位数据 和 分段数据的计算公式(就是乘以2)

   for /l %%i in (1 1 5) do (
     set /a num%%i_=0
     set /a num%%i*=2)
   set /a num6*=2
   rem ================================================

  for /l %%a in (6 -1 1) do (
     rem 每段数据保存一个6位数;  
     if !num%%a! GTR 1000000 (
        set /a Inum=%%a-1
        set /a tmp=!num%%a!
        rem ========================================================================
        rem 前面这个1是从前面的数据段“借”来的;前面加个1是为了防止set /a test=0003
        rem 类似情况的出现!

        set /a num%%a=1!tmp:~-6!
        rem ========================================================================
        
        rem 前面一段的数据加上后面一段数据的进位数再减1,因为有个1被“借”掉了!
        set /a num!Inum!+=!tmp:~0,-6!-1
        )
     )
)
   set /a num6-=1
   rem ===================================================================
   rem 扫尾工作,因为前面为了除错,采用了“借”数据的办法,下面就给它还原!

   for /l %%a in (6 -1 4) do (
        set /a Inum=%%a-1
        set /a tmp=!num%%a!
        set num%%a=!tmp:~1!
        set /a num!Inum!+=!tmp:~0,1!)
    rem ===================================================================
     for %%i in (%num1% %num2% %num3% %num4% %num5% %num6%) do (
        if %%i neq 0 set Result=!Result!%%i)
    echo !Result!
   
pause>nul
#18 !
有十张币值分别为1分、2分、5分、1角、2角、5角、1元、2元、5元、10元的人民币,能组成多少种不同的币值?

【解题思路】根据排列组合的相关知识,知道总共的组合可能有:num=C(10,1)+C(10,2)+..+C(10,10)
@echo off
setlocal enabledelayedexpansion

set /a num=1
set /a Result=0

for /l %%i in (1 1 10) do (
    call :test %%i 10
    set /a Result+=!num! & set /a num=1)
echo 币值种类有:!Result!
pause>nul

::求C(n,r);
:test start_num end_num
    set /a tmp=%2-%1+1
    for /l %%i in (%tmp% 1 %2) do set /a num*=%%i
    for /l %%i in (1 1 %1) do set /a num/=%%i

作者: namejm     时间: 2006-11-17 02:45
  既然在以前的帖子里有了代码,就不应该再开新帖来汇总,因为这样会有内容重复之嫌,同时也会过多占用论坛资源,更何况在那个帖子的顶楼随时都有可能提出新的问题,可以考虑和 zouzhxi 所开的帖子合并,zouzhxi 负责把所有的代码收齐,作为一个附件包放在帖子顶楼供大家下载,同时,也要在顶楼帖子中把解决每个题目的代码的链接贴上。不知 youxi01 兄意下如何?
作者: youxi01     时间: 2006-11-17 02:53
没问题,都是为了方便大家而已戒!~
作者: NaturalJ0     时间: 2006-11-17 03:01
亏了 = =b
第一天进来看了下,发现只有水仙花和勾股定律,就没再进来看。
今天觉得奇怪,怎么水仙花和勾股定律也能讨论三页?就再进来看了下,发现居然有这么多好玩的题目。

看了这些题,让我想起小时候做的一道题了。
有两盆水,一冷一热。冷水盆里有个温度计,用一个小杯子去弄一杯热水倒到冷水里,发现温度上升了 5 度,再倒一杯热水进去,又上升了 3 度,问再倒一杯下去,会再上升几度?
作者: zouzhxi     时间: 2006-11-17 03:59
Re 46F:
我把你的题目放到了顶楼。。。
作者: zouzhxi     时间: 2006-11-17 04:12
好,我就把代码问题收集起来,到时放上去。。。
作者: youxi01     时间: 2006-11-17 06:12
namejm斑竹,是不是把这个问题删除掉啊?
作者: 不得不爱     时间: 2006-11-17 09:32
这个主题是删除还是合并?如果要合并我可以来操作下!
作者: youxi01     时间: 2006-11-17 10:30
合并啊,谢了~
作者: namejm     时间: 2006-11-17 11:32
  其实 3742668 兄的加精操作应该是有规可循的,以前 willsort 在任的时候都已经制定过相关的规则,请看 这里,倒是我几乎天天在线,而忘记了加精,实属失职,汗~。

To zouzhxi:

  感觉兄在顶楼的帖子,在排版方面仍有不太便于检索的地方,而帖出我的方案又显得十分罗嗦,并且也可能难以准确传达出来,所以我想直接修改你顶楼的帖子,以方便日后的检索,想征求一下你的意见。
作者: zouzhxi     时间: 2006-11-17 21:10
可以,只在大家觉得方便,就行了。。。也不要改的太离谱了。。呵呵。。
作者: NaturalJ0     时间: 2006-11-17 22:22
很有意思的题啊,今天把所有题都认真看了一遍。^_^
PS: 20 题似乎就是求三个数的最大公约数
作者: 不得不爱     时间: 2006-11-17 23:55
——————————————————版务纪录——————————————————
执行:不得不爱
操作:合并主题于46,47,48,51,52,53楼
说明: 原主题{ 用批处理作趣味数学题(汇总)}与主题{ [讨论] 用批处理作趣味数学题}存在上下文的关系
————————————————————————————————————————

作者: NaturalJ0     时间: 2006-11-18 05:16
好像精华被合并掉了?
作者: namejm     时间: 2006-11-18 05:27
可能是哪位版主操作不当把精华给解除了,现在重新加入精华。不过稍有遗憾的是,本来这个帖的楼主是 zouzhxi ,但是返回到帖子列表界面去看的时候,却变成了 youxi01 ,呵呵,希望两位别介意。
作者: ccwan     时间: 2006-11-18 05:41
名利身外物,学到东西才重要。
作者: NaturalJ0     时间: 2006-11-18 05:54
加了标记(精华)比较好找。 ^_^
作者: 不得不爱     时间: 2006-11-18 07:46


  Quote:
Originally posted by namejm at 2006-11-17 16:27:
可能是哪位版主操作不当把精华给解除了,现在重新加入精华。不过稍有遗憾的是,本来这个帖的楼主是 zouzhxi ,但是返回到帖子列表界面去看的时倠...

不是把精华给解除了,是PID在被合并主题时把PID给改变了,汗一个
作者: youxi01     时间: 2006-11-19 00:07
再来攻“城堡”,先公布我的计算结果,看答案对不对先?!
19题,10位;这个这个应该没问题,9个6,一个2。
20题,14,10,35(最小公倍数的问题)
21题,1.8度
期待楼主的回复。
作者: 不得不爱     时间: 2006-11-19 00:59
第19题:
@echo off
setlocal enabledelayedexpansion
set a=3333333333
set b=9999999999
set a1=%a%0000000000
set/a jg=1%a1:~-9%-%a:~-9%
set a1=%a1:~0,-9%
set/a jg1=%a1:~-9%-1-%a:~0,-9%
set jg=%a1:~0,-9%%jg1%%jg%
for /l %%a in (0,1,19) do for /l %%b in (0,2,8) do (set tm=!jg:~%%a,1!
if !tm!==%%b set/a gs+=1)
echo %a%*%b%=%jg%
echo 共有%gs%个偶数  
pause

作者: 不得不爱     时间: 2006-11-19 01:06
第20题:
@echo off
set a=5
set b=7
set C=2
set/a ji=a*b*c
set/a a1=ji/a
set/a b1=ji/b
set/a c1=ji/c
echo 这三个齿轮齿数最少应分别是%a1%,%b1%,%c1%齿!
pause

作者: zouzhxi     时间: 2006-11-19 02:12
前面两题是对了。至于最后一题吗?由于不是我出的题,我也正在算,也不知道结果对不对!!!
作者: youxi01     时间: 2006-11-19 07:07
21题写相应的代码,我不会,但我可以说说我的解题思路:
1 >首先,要明确一杯水对于一盆水的质量可以忽略不计。
假设杯中热水的温度在最开始的时候下降了X度,则在第二次下降了X-3度
根据物理学公式:Q=cm△t可知:
3/5=(X-3)/X
解得,X=7.5
2>设第三次加热水时,盆中水的温度还可以上升a度,则:
a/3=(4.5-a)/4.5
解得,a=1.8

这是以上这个问题的解题思路,但遗憾的是,本人无法让它用计算机来自动完成。
作者: zouzhxi     时间: 2006-11-20 03:22
????
我也还没写出来。。。
!!!
作者: 不得不爱     时间: 2006-11-21 00:22
68楼的计算方法应该是错误的吧?4.5是那来的?
作者: zouzhxi     时间: 2006-11-21 00:40
我还不能用BAT写出来...不知道有哪位高手贴出代码来参考参考!!!
作者: youxi01     时间: 2006-11-21 01:27
68楼的4.5是根据7.5-3来的,那是因为第一次那个热水的问题地一次降温3度
作者: NaturalJ0     时间: 2006-11-21 03:10
标准答案是再上升 2 度。
作者: youxi01     时间: 2006-11-21 05:39
根据物理学的话就不可能!

难道真的是传说中的小学题目,我们已经人为的把它给复杂话了!
作者: NaturalJ0     时间: 2006-11-21 05:50
是初中题,这题好像不太适合用程序求解。
作者: 不得不爱     时间: 2006-11-21 23:38
不知道这个合乎要求不:
@echo off
set c1=5
set c2=3
set/a pen=2*c2/(c1-c2)
set/a 温差=(pen+1)*c1
set/a 温升=(温差-c1-c2)/(pen+3)
echo 原来水有%pen%杯,原来盆里的水和杯里的水的温差是%温差%度。
echo 现在温升是%温升%度。
pause

作者: NaturalJ0     时间: 2006-11-21 23:58
完全正确
作者: 不得不爱     时间: 2006-11-22 02:03
不知道还有什么题目没有?
作者: zouzhxi     时间: 2006-11-22 05:06
问题已更新
作者: youxi01     时间: 2006-11-22 07:17
先来最简单的25、26
25、”鸡兔同笼“
@echo off
setlocal enabledelayedexpansion

for /l %%i in (1 1 79) do (
    set /a chick_num=%%i
    set /a dog_num=79-!chick_num!
    set /a footnum=2*!chick_num!+4*!dog_num!
    if !footnum! EQU 200 (
        set msg1=小鸡的只数为:!chick_num!
        set msg2=狗的只数为:!dog_num!
        goto :exit
     )
)
:exit
    echo %msg1%
    echo %msg2%
pause>nul
26、大小和尚的问题;
@echo off
setlocal enabledelayedexpansion

for /l %%i in (0 4 100) do (
    set /a small=%%i/4
    set /a big=400-%%i*4
    set /a total=!small!+!big!
    if !total! EQU 100 (
        set msg1=小和尚人数为:%%i
        set /a num=100-%%i
        set msg2=大和尚人数为:!num!
        goto :exit
    )
)

:exit
   echo %msg1%
   echo %msg2%

pause>nul

作者: youxi01     时间: 2006-11-22 07:40
23题,称珠子的问题,应该是舍弃“运气好”的情况吧,我要是运气好,说不定两次就搞定!^--^
@echo off
setlocal enabledelayedexpansion
set flag=1
call :test 243
echo 至少应该要:%flag%次

pause>nul

:test
   set /a tmp=%1 %% 2
   set /a num=%1
   if %tmp% NEQ 0 set /a num-=1
       if %num% geq 2 (
          set /a num/=2
          set /a flag+=1
          call :test !num!)
   goto :eof

作者: youxi01     时间: 2006-11-23 07:09
我也来贴两题:

1、找素数(效率要求较高)
2、找出1-49之内,任意两数相乘,乘积相等的数字(如:2*3=6 和1*6=6)
作者: redtek     时间: 2006-11-25 03:04
期待~~绝不能让好贴沉下去~:)
作者: 不得不爱     时间: 2006-11-25 06:57
找10000以内的素数
@echo off
setlocal enabledelayedexpansion
echo 10000以内的素数有:
set/p a= 2 3 5 7 <nul
for /l %%a in (9 2 99) do (set/a a=%%a%%3
set/a b=%%a%%5
set/a c=%%a%%7
if not !a!==0 if not !b!==0 if not !c!==0 set/p a=%%a <nul)
for /l %%a in (101 2 9999) do (for /l %%b in (3 2 97) do (set/a a=%%a%%%%b
if !a!==0 set b=1)
if not !b!==1 set/p a=%%a <nul
set b=0)

作者: 不得不爱     时间: 2006-11-25 07:03
第24题:
@echo off
:1
set/a a+=3
set/a b+=1
if not %a%==9 goto 1
echo 这只青蛙要蹦%b%次才能跳出井口
pause
第25题:
@echo off
set/a a=(200-79*2)/(4-2)
set/a b=79-a
echo 共有%b%只鸡,%a%只狗
pause

作者: 不得不爱     时间: 2006-11-25 07:13
26题:
@echo off
set/a a=(100*4-100*1)/(4*4-1)
set/a b=100-a
echo 共有%b%个小和尚,大和尚%a%个
pause

作者: youxi01     时间: 2006-11-25 11:58
欣赏 不得不爱 斑竹的素数搜索程序;

斑竹对24 25 26的解答似乎是解方程的方式哦
作者: youxi01     时间: 2006-11-25 12:10
找出1-43之内,任意两数相乘,乘积相等的数字(如:2*3=6 和1*6=6)

贴一段自己的不成熟的代码:
@echo off
setlocal enabledelayedexpansion

for /l %%a in (2 1 49) do (
   for /l %%b in (%%a 1 49) do (
      title %%a %%b
      set /a mult=%%a*%%b
      call :test !mult! %%a %%b
      set !mult!=%%a × %%b
    )
)
pause>nul

:test
    if defined %1 (
       echo !%1!=!mult!
       echo %2 × %3 =!mult!
       echo.)

作者: 不得不爱     时间: 2006-11-25 21:48


  Quote:
Originally posted by youxi01 at 2006-11-24 22:58:
欣赏 不得不爱 斑竹的素数搜索程序;

斑竹对24 25 26的解答似乎是解方程的方式哦

小学时算鸡兔问题不就是这么算的吗,难道还要解方程?
作者: 不得不爱     时间: 2006-11-25 21:59
88楼的代码漏了不少的数哦
如:
2*27=54
3*18=54
6*9=54
1*54=54
而你的代码却只输出:
2*27=54
3*18=54
作者: youxi01     时间: 2006-11-25 22:28
它会求出来的,但是不在一个地方。它给出的形式是这样的:
1×54=54
2×27=54
.......
2×27=54
3×18=54
……
3×18=54
6×9=54
作者: 不得不爱     时间: 2006-11-25 22:37
那不就乱套了吗
作者: a9319751     时间: 2006-11-27 15:09
#25 ?
鸡狗各多少=
小鸡、小狗七十九,二百只脚在地上走,想一想,算一算,多少只鸡?多少只狗?

@echo off
set /a 鸡狗=79
set /a 鸡腿狗腿=200
set /a 最大狗=200/4
setlocal enabledelayedexpansion
for /l %%i in (1 1 %最大狗%) do (
                          set /a 狗腿=%%i*4
                          set /a 鸡腿=%鸡腿狗腿%-!狗腿!
                          set /a 鸡=!鸡腿!/2
                          set /a num=%%i+!鸡!
                          call :test !num! %%i !鸡! %鸡狗%
                          )

pause>nul

:test
   if %1 EQU %4 echo 可能的组合为:狗=%2 鸡=%3
   goto :eof
作者: 40szb     时间: 2006-12-28 14:32
收藏ing
作者: redtek     时间: 2007-1-29 08:12
好贴子顶起来~:)


把一个许久被沉没的好贴子顶起来而又不多发垃圾贴的办法就是:将原自己在帖子中写的回复删掉(-1分),然后再重新回复一遍就可以了~:)


[ Last edited by redtek on 2007-1-28 at 07:14 PM ]
作者: 0401     时间: 2007-1-29 10:57
顶贴还有这门学问啊,学习了。
作者: hngaoshou     时间: 2007-2-1 02:50
没的速度
作者: nzisisco     时间: 2007-3-4 17:13
全是高人 飘过```
作者: 6622186     时间: 2007-3-17 11:09
原来最大数为 2^31-1 ,怪不得 2^31 就溢出了!
作者: 6622186     时间: 2007-3-17 11:42
如果能过滤 3 4 5 和 5 12 13 的倍数就好了.
作者: 6622186     时间: 2007-3-17 12:39
84 楼代码不错, 运行效律很高.
作者: 6622186     时间: 2007-3-19 11:59    标题: 大小和尚的问题

@echo off
rem x+y=n m*x+y/m=n
set n=100
set m=4
set x=100/(1+m)
set y=x*m
echo 大和尚人数为%x%
echo 大和尚人数为%y%
pause>nul
作者: 6622186     时间: 2007-3-19 12:08    标题: 更正

出现了几个错误, 第五行应将 "100" 改为 "n". 第八行应将 大 改为 "小" . 特此更正, 请多多原谅.
作者: 6622186     时间: 2007-3-19 12:39    标题: 多少人参加运动会?

一个学校开运动会,一个班主任老师发现, 参加运动会的同学,如果排成 2 行多 1 人, 排成3 行多 2人, 排成 4 行多 3 人, 排成 5 行多 4 人, 排成 6 行多 5 人, 请问这个学校至少有多少人参加这个运动会?
作者: youxi01     时间: 2007-3-19 12:57
通过数学知识知道,该数字加 1 后是 2 3 4 5 6的倍数。
于是,有了以下代码:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1 1 10000) do (
   title 正在检测 %%i
   set/a temp=%%i+1
   set/a flag=0
   for %%a in (2 3 4 5 6) do (
       set /a tmp=!temp! %% %%a
       if !tmp! EQU 0 set/a flag+=1)
   if !flag! GEQ 5 echo 该数字为:%%i & goto :exit)
:exit
pause>nul

作者: 6622186     时间: 2007-3-20 01:07    标题: 打印数字金字塔

如题: 用批处理显示

                                        1
                                      121
                                    12321
                                ........................
                          12345678987654321
禁止全部使用 echo 命令.
作者: youxi01     时间: 2007-3-20 01:39
试下以下代码?
@echo off
setlocal enabledelayedexpansion
set "space=         "

for /l %%i in (1 1 9) do (
    for /l %%a in (1 1 %%i) do (
         set str1=!str1!%%a
         set str2=%%a!str2!
         set str=%space%!str1!!str2:~1!
      )
    echo !str:~%%i!
    set str1=
    set str2=
    set str=
)
pause>nul

作者: 6622186     时间: 2007-3-20 02:41    标题: 一共有多少苹果

这是个很简单的数学题.    妈妈买回一篓苹果, 老大拿走了1/3, 老二拿走了剩下的1/3, 老三又拿走了剩下的1/3, 这时还剩 8 个苹果, 一共有多少苹果?
作者: 6622186     时间: 2007-3-20 02:53    标题: 打印 N 阶矩阵.

如题, N>=3, 可不用表格形显示. 如:

                         2       7        6

                         9       5        1

                         4       3        8
作者: 6622186     时间: 2007-3-20 03:08    标题: 酷似百鸡问题

1. 36块砖, 36人搬, 男搬4, 女搬3, 两个小孩抬块砖. 男人,女人和小孩各有多少人?

2. 百钱买百牛, 公牛3贯, 母牛4贯,小牛600文, 公牛,母牛和小牛各有多少头?(一贯=1000文)
作者: 6622186     时间: 2007-3-20 03:52    标题: 古代问题(九章算术,七, 盈不足), 求人数和羊价.

有一群人一起买羊, 若每人出 5 两, 还差 45 两, 若每人出 七 两, 还差 3 两, 问有多少买羊, 羊的价钱是多少.
作者: youxi01     时间: 2007-3-20 04:54


  Quote:
Originally posted by 6622186 at 2007-3-20 02:41 AM:
这是个很简单的数学题.    妈妈买回一篓苹果, 老大拿走了1/3, 老二拿走了剩下的1/3, 老三又拿走了剩下的1/3, 这时还剩 8 个苹果, 一共有多少苹果?


@echo off
setlocal enabledelayedexpansion

for /l %%i in (1 1 10000) do (
    title 正在检测 %%i ....
    set /a tmp=%%i*8/27
    if !tmp! EQU 8 echo %%i && goto :exit
)
:exit
pause>nul
其实,以上的代码还可以简单的(根据数学原理),简单到不好意思(没什么代码可以写了。)
作者: 6622186     时间: 2007-3-20 11:34
这样就可以计算大于2^31 的数字, 我以为不可能, 不过代码不太懂. 看到 ! 就头疼.
作者: scriptor     时间: 2007-3-20 18:29
112楼

你是不是先算了再写成这样的?

你的那句"set/a tem=%%i*8/27&np if !temp! equ 8 echo %%i....." 不就是说%%i是27 吗?

那还算什么?
作者: scriptor     时间: 2007-3-20 18:38
完整的解法是这样的:

设共有Y。
第一次取了它的1/3, 留了2/3*Y;
第二次又取了剩下的1/3,就留了2/3*(2/3*Y);
第三次再取第二次取后剩下的1/3,只留下2/3*(2/3*(2/3*Y)).

hehe  
这就是说:2/3*(2/3*(2/3*Y))=8
那么Y就是27。
作者: youxi01     时间: 2007-3-20 22:21


  Quote:
Originally posted by scriptor at 2007-3-20 06:29 PM:
112楼

你是不是先算了再写成这样的?

你的那句"set/a tem=%%i*8/27&np if !temp! equ 8 echo %%i....." 不就是说%%i是27 吗?

那还算什么?

如果说,要完全模拟用程序来解决的话,似乎更简单.根据题目的意思,这个数一定是27的倍数(它可以连续被3除3次).所以代码可以写成:

for /l %%i (27 27 100000) do (
   ....)

似乎是更简单了,一下就可以得出是 27.
作者: namejm     时间: 2007-3-21 02:29


  Quote:
Originally posted by 6622186 at 2007-3-19 12:07:
如题: 用批处理显示

                                        1
                                      121
                                    12321
                                ........................
                          12345678987654321
禁止全部使用 echo 命令.

  临走前跟个代码帖:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do (
    for /l %%j in (9,-1,%%i) do set /p= <nul
    for /l %%k in (1,1,%%i) do set /p=%%k<nul
    set /a num=%%i-1
    for /l %%l in (!num!,-1,1) do set /p=%%l<nul
    echo.
)
pause

作者: dbslong     时间: 2007-6-13 23:17    标题: #25题,小鸡21只,小狗58,“借花献佛“

@echo off
echo.
echo 小鸡、小狗七十九,二百只脚在地上走,想一想,算一算,多少只鸡?多少只狗?
echo.
setlocal enabledelayedexpansion
set /a x=79
set /a y=200
for /l %%i in (1,1,79) do (
    for /l %%j in (1,1,50) do (

            set /a a=2*%%i
            set /a b=4*%%j            
            set /a sum1=%%i+%%j
            set /a sum2=!a!+!b!
            if !sum1! equ !x! if !sum2! equ !y!  echo %%i %%j
           )
)
pause
作者: dbslong     时间: 2007-6-13 23:28    标题: 第26# 大和尚20小和尚80

@echo off
echo.
echo 百个和尚百个粑,大和尚每人粑四个,小和尚四人一个粑,大、小和尚各有几?
echo.
setlocal enabledelayedexpansion
set /a x=100
for /l %%i in (1,1,25) do (
    for /l %%j in (1,1,100) do (

            set /a a=4*%%i
            set /a b=%%j/4            
            set /a sum1=%%i+%%j
            set /a sum2=!a!+!b!
            if !sum1! equ !x! if !sum2! equ !x!  echo "大和尚" %%i "小和尚" %%j
           )
)
pause
作者: lwgea     时间: 2007-6-27 16:15    标题: 语言无界线

确实是.
作者: cl02     时间: 2007-6-27 23:00
支持这样的贴子~~~~强
作者: my3439955     时间: 2007-6-30 11:46
第16题

  Quote:
p是质数,且p×p+1也是质数。求2006×p。解决方案:暂无

先说p*p+1不能是2,这样的话 p=1,不是质数

假设p是奇数,那么p*p也是奇数,p*p+1就是偶数,并且p*p+1是质数,又不是二,这是不可能的

因此p是偶数,又 p是质数,因此p=2

2006*2=?
作者: chenghui     时间: 2007-6-30 18:34    标题:

很高
作者: maladana     时间: 2007-7-8 00:51
大家都太强了啊,佩服
作者: 3dnowex     时间: 2007-8-20 18:04
第一题求水仙花数的简便方法:
@echo off && setlocal enabledelayedexpansion
for /l %%i in (100 1 999) do (
        set tin=%%i
        set /a ton=!tin:~0,1!*!tin:~0,1!*!tin:~0,1!+!tin:~1,1!*!tin:~1,1!*!tin:~1,1!+!tin:~-1!*!tin:~-1!*!tin:~-1!
        if !tin! equ !ton! (
                echo %%i
        )
)
pause>nul

[ Last edited by 3dnowex on 2007-8-20 at 06:08 PM ]
作者: zouzhxi     时间: 2007-8-21 12:15    标题: 新题目来了.

#
求1000以内的完数.
所谓完数:
例如:
6
2*3=6
2+3+1=6
只要符合上述两要求就可以了.(第二条件是+1不可少的)

{
  ??????
}
作者: youxi01     时间: 2007-8-21 13:21

@echo off & setlocal enabledelayedexpansion
for /l %%i in (6 1 1000) do (
    title 正在检测:%%i
    set/a sum=1
    set/a partnum=%%i/2
    for /l %%j in (2 1 !partnum!) do (
       set/a var=%%i %% %%j
       if !var! EQU 0 set/a sum+=%%j)
    if !sum! EQU %%i echo %%i是完数)
pause

作者: youxi01     时间: 2007-8-21 13:52
Re:126F,来段效率高点的代码:
@echo off & setlocal enabledelayedexpansion
for /l %%i in (6 1 1000) do (
    title 正在检测:%%i
    set/a sum=1
    set/a partnum=%%i/2
    if !partnum! gtr 40 set/a partnum=40
    for /l %%j in (2 1 !partnum!) do (
         set/a var=%%i %% %%j
         if !var! EQU 0 (
              set/a tmp=%%i/%%j
              if !tmp! gtr %%j set/a sum+=!tmp!+%%j))
    if !sum! equ %%i echo %%i是完数
)
pause>nul

作者: youxi01     时间: 2007-8-21 14:00
有个奇怪的现象:
用第二段代码检测1000以内的完数只有三个:6 28 496
改装一下,检测10000以内的完数也只多了一个而已:8128
是不是因为数字大,因而因子多,因子之和一般就比本身大,所以完数出现的概率就特别小啊?!
作者: zjq20032006     时间: 2007-8-25 01:49
有点意思            .
作者: Eblis     时间: 2007-8-25 22:51
25题
@echo off
setlocal enabledelayedexpansion
set /a gj=79
for /l %%i in (1,1,79) do (
  set /a j1=200-%%i*4
  set /a j=j1/2
  set /a jg=!j!+%%i
if !jg! equ !gj! echo 鸡=!j! 狗=%%i
)
借鉴了youxi01的骆驼峰的算法..
作者: qyjytd     时间: 2007-9-12 23:25
呵呵 有趣 学习了
作者: qyjytd     时间: 2007-9-12 23:25
呵呵 有趣 学习了
作者: zjh104032135     时间: 2007-9-20 21:14    标题: 看见高手了呀

看见高手学习下》
作者: zouzhxi     时间: 2007-9-24 10:18
28
2*8=16
2+8+1=11

28是么...
作者: zouzhxi     时间: 2007-9-24 10:18
28
2*8=16
2+8+1=11

28是么...
作者: zouzhxi     时间: 2008-8-6 11:14    标题: 将经典延续下去

[网络问题,所以发了两次]
试卷上有6道选择题,每题有3个选项,结果阅卷老师发现,在所有的卷子中任选3张答卷,都有一道题的选择互不相同,请问最多有多少人参加了这次考试??

[ Last edited by zouzhxi on 2008-8-6 at 11:15 AM ]
作者: zouzhxi     时间: 2008-8-6 11:15    标题: 将经典延续下去

试卷上有6道选择题,每题有3个选项,结果阅卷老师发现,在所有的卷子中任选3张答卷,都有一道题的选择互不相同,请问最多有多少人参加了这次考试??
作者: lpk130     时间: 2008-9-7 21:33


  Quote:
Originally posted by zouzhxi at 2007-9-24 10:18:
28
2*8=16
2+8+1=11

28是么...

28
28=2*14=4*7
2+14+4+7+1=28
作者: litengfeng     时间: 2008-11-20 01:07
有意思