Board logo

标题: 给5个人分10个苹果的方法 [打印本页]

作者: jmz573515     时间: 2007-1-20 23:54    标题: 给5个人分10个苹果的方法

给5个人分10个苹果(每人至少分到一个苹果)
aa=0
do until aa=1
i=inputbox("你想给5人分几个苹果?(每人至少一个)","请输入苹果数")
if i="" then
wscript.quit
elseif IsNumeric(i)=false  then
msgbox "输入错误,请重新输入!",16+4096,"错误"
elseif i<5 then
msgbox "苹果数不能小于5,请重新输入!",16+4096,"错误"
elseif i>15 then
yesno=msgbox("苹果数大于15时速度可能会很慢,要继续吗?",32+4096+vbyesno,"提示")
if yesno=vbyes then
aa=1
end if
else
aa=1
end if
loop

set fso=createobject("scripting.filesystemobject")
set ws=createobject("wscript.shell")
set file=fso.createtextfile("OUT.txt",2)
for a=1 to ccur(i)-4
for b=1 to ccur(i)-4
for c=1 to ccur(i)-4
for d=1 to ccur(i)-4
for e=1 to ccur(i)-4
if a+b+c+d+e=ccur(i) then
h=h+1
s=s & "│" & a & vbtab & "│" & b  & vbtab & "│" & c  & vbtab & "│" & d  & vbtab & "│" & e &vbtab &"│" &vbcrlf & "├───┼───┼───┼───┼───┤"&vbcrlf

end if
next
next
next
next
next
s=Left(s,Len(s)-Len("├───┼───┼───┼───┼───┤"&vbcrlf))
file.write "给5个人分"&i&"个苹果(每人至少分到一个苹果)一共有" & h &"种方法" & vbcrlf & vbcrlf
file.write "┌───┬───┬───┬───┬───┐"& VBcrlf
file.write  "│A" & vbtab &"│B" & vbtab &"│C" & vbtab &"│D" & vbtab &"│E" & vbtab &"│" & VBcrlf
file.write "┝━━━┿━━━┿━━━┿━━━┿━━━┥"& VBcrlf
file.write s
file.write "└───┴───┴───┴───┴───┘"
file.close
ws.run "notepad.exe OUT.txt"
[ Last edited by jmz573515 on 2007-2-1 at 02:27 PM ]
作者: PPdos     时间: 2007-1-21 00:17    标题: 要求应该再加上:

每人至少分到一个苹果 不然有10与0的分法 就不止126了
作者: jmz573515     时间: 2007-1-21 00:21
谢谢2楼的提醒,是应该有“每人至少分到一个苹果”的条件。
作者: namejm     时间: 2007-1-21 03:07
  我跟一个bat版的吧:
@echo off
(
echo ┌───┬───┬───┬───┬───┐
echo │  A   │  B   │  C   │  D   │  E   │
)>result.txt
setlocal enabledelayedexpansion
for /l %%i in (1,1,6) do (
    for /l %%j in (1,1,6) do (
        for /l %%k in (1,1,6) do (
            for /l %%l in (1,1,6) do (
                for /l %%m in (6,-1,1) do (
                    set /a num=%%i+%%j+%%k+%%l+%%m
                    if !num! equ 10 (
                        if !count! equ 0 (echo ┝━━━┿━━━┿━━━┿━━━┿━━━┥
                            ) else echo ├───┼───┼───┼───┼───┤
                        echo │  %%i   │  %%j   │  %%k   │  %%l   │  %%m   │
                    )>>result.txt&set /a count+=1
                )
            )
        )
    )
)
(
echo └───┴───┴───┴───┴───┘
echo 5人分10个苹果^(每人至少分到一个^)总共有%count%种分法
)>>result.txt
start result.txt
  还是把粗线条添上吧,免得影响美观

[ Last edited by namejm on 2007-1-20 at 02:50 PM ]
作者: ccwan     时间: 2007-1-21 03:15
百家争鸣是很好的学习方法,欣赏二位~~
作者: tao0610     时间: 2007-1-21 03:36
可以用递归不过效率会很低.
作者: PPdos     时间: 2007-1-21 14:37
不得不服 版主排版如此清晰层次分明 使人一目了然 在下惭愧了。。

但从计算速度来vbs更胜一筹

大概因为这句 if !num! equ 10 让程序自动匹配所造成的 。。如果想增加速度又不

知道有没其他方法?
作者: jmz573515     时间: 2007-1-22 00:16
修改一下,可以输入苹果数就好了。

[ Last edited by jmz573515 on 2007-1-22 at 10:07 PM ]
作者: namejm     时间: 2007-1-22 00:38
  那我也修改一下可以指定苹果数的批处理。测试了15个苹果数,批处理果然慢得很,并且排版也会有问题(虽然可以处理一下,但是代码会比较复杂,也没有多大的通用性):
@echo off

:begin
cls
set count=0
set input=
set /p input= 请输入苹果数(退出请直接回车):
if not defined input exit
if %input% lss 5 echo  苹果数太少,请重新输入&pause&goto begin
set /a max=%input%-4
(
echo ┌───┬───┬───┬───┬───┐
echo │  A   │  B   │  C   │  D   │  E   │
)>result.txt
setlocal enabledelayedexpansion
for /l %%i in (1,1,%max%) do (
    for /l %%j in (1,1,%max%) do (
        for /l %%k in (1,1,%max%) do (
            for /l %%l in (1,1,%max%) do (
                for /l %%m in (%max%,-1,1) do (
                    set /a num=%%i+%%j+%%k+%%l+%%m
                    if !num! equ %input% (
                        if !count! equ 0 (echo ┝━━━┿━━━┿━━━┿━━━┿━━━┥
                            ) else echo ├───┼───┼───┼───┼───┤
                        echo │  %%i   │  %%j   │  %%k   │  %%l   │  %%m   │
                    )>>result.txt&set /a count+=1
                )
            )
        )
    )
)
(
echo └───┴───┴───┴───┴───┘
echo 5人分%input%个苹果^(每人至少分到一个^)总共有%count%种分法
)>>result.txt
start result.txt
goto begin

作者: tghksj01     时间: 2007-1-23 08:50
这其实是一个分割法的问题,
namejm 老师及前面几位老师使用嵌套碰撞测试的方法
在模数较大时会极度浪费资源,而且效率极低
比较直接的方法是利用IF语句控制分割规律,直接按规律给出结果.
下面是一个粗劣的例子:
::分苹果问题的延伸,分割法规律控制.
::tghksj@http://www.cn-dos.net/
::tghksj@http://w.vicp.net/
::转载请注明出处.谢谢啊:) 20070122
@ECHO %DBG% OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:SETUP
SET /P RS=(回车退出)输入人数:           & IF NOT DEFINED RS EXIT /B
SET /P PG=(回车退出)输入苹果数:         & IF NOT DEFINED PG EXIT /B
SET /P ZS=输入每人最少分苹果数:         & IF NOT DEFINED ZS EXIT /B
SET /A ZD=%PG%-(%RS%-1)*%ZS%,f=0,g=%RS%-1,j=%RS%-2
IF %ZD% LSS %ZS% (ECHO 不可能,重新输入. & GOTO :SETUP)
FOR /L %%i IN (1,1,%RS%) DO (SET /A R%%i=!ZS! & IF !RS!==%%i SET /A R%%i=!ZD!)

:MAIN
CALL :PRI & IF %R1%==%ZD% GOTO :EOF
IF !R%RS%!==%ZS% (
                  CALL :GUI & CALL :JIN & CALL :ADD
                  SET /A R%RS%=%PG%-!h!,j=%RS%-2
                  GOTO :MAIN
                  )
SET /A R%RS%-=1,R%g%+=1
GOTO :MAIN

:PRI
FOR /L %%i IN (1,1,%RS%) DO SET /P=!R%%i! <NUL
SET /A f+=1 & ECHO : !f!
GOTO :EOF

:GUI
FOR /L %%i IN (%j%,1,%g%) DO (IF %%i NEQ %j% SET /A R%%i=%ZS%)
GOTO :EOF

:JIN
SET /A R%j%+=1
CALL :ADD
SET /A h=%h%+(%ZS%-1)
IF %h%==%PG% (SET /A j-=1 & CALL :GUI & CALL :JIN)
GOTO :EOF

:ADD
SET /A h=0
FOR /L %%i IN (1,1,%g%) DO (SET /A h+=!R%%i!)
GOTO :EOF
[ Last edited by tghksj01 on 2007-1-31 at 04:20 PM ]
作者: tghksj01     时间: 2007-2-1 05:22
好久没来了,代码优化了一下,顶一下,路过的评测一下,

----------------
今天去市里参加计算机技能比武,名次又是内定的....郁闷...
作者: huzixuan     时间: 2007-2-1 07:26
一定要眼看明白!
作者: anqing     时间: 2007-2-1 09:51
虽然看不全懂,佩服
作者: gl315     时间: 2007-2-2 01:46
真羡慕,什么时候才能到这种水平啊?
作者: qjbm     时间: 2007-2-3 02:54
VBS确实有先天优势...这点在此帖的代码比拼中完全体现出来了.

同样的"穷举碰撞测试算法"
VBS的:
if a+b+c+d+e=ccur(i) then
比批处理的:
set /a num=%%i+%%j+%%k+%%l+%%m
if !num! equ %input% (...)
快的叫人匪夷所思....

难道VBS在执行时会自动优化算法?

其速度简直与10楼批处理的"分割法规律控制"算法相抗衡.

10楼MAIN"函数"已经是极至算法..可是速度与VBS代码的穷举法相当...

看来批处理用来节省一下体力还不错,真正用来复杂计算就有点不能胜任了....