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 ? 大、小和尚各有几= 这是一道古算题:百个和尚百个粑,大和尚每人粑四个,小和尚四人一个粑,大、小和尚各有几? #??? 新题目 www.cn-dos.net/forum ... ——————————————分割线——————————————— *********************************** 版务日志 *********************************** 操 作: 主题加精 执行人: 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是一组连继数字
另一题: 有四个数,其中任意三个数相加,所得的和分别是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
你们还有什么简单点的法子!!!!
再来一题:
赵姑娘的岁数有以下特点: 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
再来一条,
排一本辞典的页码共用了4889个数字。这本辞典共有多少页? 答案:1499。
阿聪说他这次去西北看见一群骆驼,共有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
为了促进算法研究,,,呵呵。。
有一个五位奇数,将这个五位奇数中的所有2都换成5,所有5也都换成2,其他数保持不变,得到一个新的五位数,若新五位数的一半仍比原五位数大1,那么原五位数是多少?

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

作者: zouzhxi     时间: 2006-11-15 02:25
五个连续自然数的和分别能被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的要求:
#序号 !解决 ?未解决 #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,求被除数。
#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
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
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
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
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
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
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题
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
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
有意思