Board logo

标题: [讨论][共同参与]求表格中数的规律[挑战分割法算法极限] [打印本页]

作者: qjbm     时间: 2007-2-5 10:18    标题: [讨论][共同参与]求表格中数的规律[挑战分割法算法极限]

表格如下:


1 1 组合为  1
1 2 组合为  1
1 3 组合为  1
.........
2 2 组合为  2
2 3 组合为  3
2 4            4
..........
3 3           6
3 4          10
3 5          15
...........
9 9          12870

请问:        
13 15 组合为 多少?
--------------------------------------------
下面的代码不是用来描述表格规律的,但是可以用做验证结果.
计算速度太慢,这正是为什么要求表格规律的原因.
@ECHO %DBG% OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:SETUP
SET /P ONE=输入第一个数:           & IF NOT DEFINED ONE EXIT /B
SET /P TWO=输入第二个数:           & IF NOT DEFINED TWO EXIT /B
SET /A ZS=1,ZHE=%ONE%+%TWO%-1
SET /A ZD=%ZHE%-(%ONE%-1)*%ZS%,f=0,g=%ONE%-1,j=%ONE%-2
FOR /L %%i IN (1,1,%ONE%) DO (SET /A R%%i=!ZS!) & SET /A R%ONE%=!ZD!

:MAIN
CALL :PRI & IF %R1%==%ZD% (ECHO %ONE% %TWO% 组合值为: !f! & GOTO :EOF)
IF !R%ONE%!==%ZS% (
                  CALL :GUI & CALL :JIN & CALL :ADD
                  SET /A R%ONE%=%ZHE%-!h!,j=%ONE%-2
                  GOTO :MAIN
                  )
SET /A R%ONE%-=1,R%g%+=1
GOTO :MAIN

:PRI
SET /A f+=1
CLS & ECHO 第        !f!        次计算
GOTO :EOF

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

:JIN
SET /A R%j%+=1
CALL :ADD
SET /A h=%h%+(%ZS%-1)
IF %h%==%ZHE% (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
引发问题相关帖:
http://www.cn-dos.net/forum/viewthread.php?tid=26911&fpage=4
本贴若代码化图表规律计算式,
则可在进行 所有可行性条件列举 前得所有可行性条件总和.

[ Last edited by qjbm on 2007-2-5 at 12:28 AM ]
附件 1: fgf.jpg (2007-2-5 11:39, 65.88 K, 下载附件所需积分 1点 ,下载次数: 5)


附件 2: plzh.bmp (2007-2-5 13:28, 67.85 K, 下载附件所需积分 1点 ,下载次数: 7)



作者: scriptor     时间: 2007-2-5 12:52
你这个居然是杨辉三角

那么规律就很明显了

哈哈哈
作者: qjbm     时间: 2007-2-5 13:05    标题: 正是杨辉三角

正是杨辉三角

正在考虑批处理是否可以实现nCr函数功能.

节省资源,在楼上回了,

nCr和nPr计算是排列组合(分割法)相关,与帕斯卡三角形有直接关系.

有的同学会很纳闷的问,排列组合(分割法)与帕斯卡三角形有什么关系?

总范围 - 平均底限*组数 与 方法数  的关系 正是帕斯卡三角形

也就是说,在求分割法时,我可以屏弃以前的nCr和nPr计算,而利用帕斯卡三角形

直接得出结果.

相关资料:
http://www.dsej.gov.mo/~webdsej/www_gtrc/course/Senior/SMath2.htm
第6章

[ Last edited by qjbm on 2007-2-6 at 08:08 PM ]
作者: scriptor     时间: 2007-2-5 14:41
实现nCr函数功能?

这个和那个有关??

请问你想要什么??
作者: namejm     时间: 2007-2-5 15:20
  做了个15×15的表格出来,至于要实现指定的功能,请自行修改——BTW,此方法会设置大量的变量,并且排版只限于9个以下的数字,局限性是比较大的:
@echo off
setlocal enabledelayedexpansion
mode con cols=170
set /p=┌──<nul
for /l %%i in (1,1,14) do set /p=──┬──<nul
set /p=──┐<nul
echo.

:loop
call :creat_num
set /p=├──<nul
for /l %%i in (1,1,14) do set /p=──┼──<nul
set /p=──┤<nul
echo.
if %lines% lss 14 goto loop
call :creat_num
set /p=└──<nul
for /l %%i in (1,1,14) do set /p=──┴──<nul
set /p=──┘<nul
echo.
pause
exit

:creat_num
set /a lines+=1
for /l %%i in (1,1,15) do (
    if !lines! equ 1 (
        set num!lines!_%%i=1
    ) else (
        if %%i equ 1 (
            set num!lines!_%%i=1
        ) else (
             set /a SN1=!lines!-1
             set /a SN2=%%i-1
             call set /a num!lines!_%%i=%%num!SN1!_%%i%%+%%num!lines!_!SN2!%%
        )
    )
    call set num=        %%num!lines!_%%i%%
    set num=!num:~-8!
    if %%i leq 2 (
        set /p=│!num!<nul
    ) else (
        if %%i geq !lines! (
            set /p=│!num!<nul
        ) else (
            set /p=│        <nul
        )
    )
)
set /p=│<nul
echo.
goto :eof

作者: redtek     时间: 2007-2-5 22:57
太精彩了~~

而且昨天发的帖子居然论坛上显示有:17122人浏览过此帖,1天就有1万7千多人浏览,破纪录了~:)
作者: vkill     时间: 2007-2-5 23:10
还没有看到规律
作者: namejm     时间: 2007-2-5 23:14


  Quote:
Originally posted by redtek at 2007-2-5 09:57:
而且昨天发的帖子居然论坛上显示有:17122人浏览过此帖,1天就有1万7千多人浏览,破纪录了~:)

  再看看精华帖里的“ 无奈何签名代码略析 ”,居然只有40次的浏览量,看来论坛的计数器是发生了一点错乱。

  5楼的代码还有一个致命的缺陷:因为涉及到数值的运算,所以,不能处理两数之和超过2^31-1的情况。
作者: namejm     时间: 2007-2-5 23:18


  Quote:
Originally posted by vkill at 2007-2-5 10:10:
还没有看到规律

  这是一个杨辉三角的正方形表格形式,杨辉三角的规律是:某个数字等于它两肩上的两个数字之和。具体到这个表格中,就是某个数字等于同一行前一列的数与前一行同一列的数之和。
作者: 无奈何     时间: 2007-2-6 00:40


  Quote:
Originally posted by namejm at 2007-2-5 23:14:

  再看看精华帖里的“ 无奈何签名代码略析 ”,居然只有40次的浏览量,看来论坛的计数器是发生了一点错乱。

这个帖子的点击会如此高,是不是有人刷点击,或者进行过帖子合并等版务管理?

willsort 兄发的那个帖子,是我操作失误造成的,将另一个帖子归并到此贴时顺序错了。重新分割后造成 ID 改变,点击数丢失。

[ Last edited by 无奈何 on 2007-2-6 at 02:06 AM ]
作者: 20080610     时间: 2007-2-6 02:44
明显被刷过点击....
作者: electronixtar     时间: 2007-2-7 00:42
有的人不想混了......以为联盟没有人了说?
作者: qjbm     时间: 2007-2-7 08:38
5楼 namejm的代码对排版的控制相当精彩.
call set /a num!lines!_%%i=%%num!SN1!_%%i%%+%%num!lines!_!SN2!%%
也正是描述杨辉三角的:除了斜边为1的数之外其他都是他肩上两个数字之和的规律.

但是我想要计算的规律或者应该说通项公式是:

在矩形列表形式描述下,仅利用纵横坐标求相交点值.

节省..在楼上回了.---

...............看样子是我的表达能力有点问题.

递加的不算.....

[ Last edited by qjbm on 2007-2-6 at 08:25 PM ]
作者: namejm     时间: 2007-2-7 09:21


  Quote:
Originally posted by qjbm at 2007-2-6 19:38:
但是我想要计算的规律或者应该说通项公式是:

在矩形列表形式描述下,仅利用纵横坐标求相交点值.  

  我说过,自行修改就可以达到目的,其实修改起来是很容易的事情,以下代码加入了简单的出错检测,请配合5楼的代码使用:
@echo off
setlocal enabledelayedexpansion

:begin
cls
set lines=0
set input=
set /p input=  请输入以空格分隔的行数和列数(比如3 6):
call :loop %input%

:loop
if %1 gtr %2 goto begin
if %2 gtr 17 goto begin
set /a lines+=1
for /l %%i in (1,1,%2) do (
    if !lines! equ 1 (
        set num!lines!_%%i=1
    ) else (
        if %%i equ 1 (
            set num!lines!_%%i=1
        ) else (
             set /a SN1=!lines!-1
             set /a SN2=%%i-1
             call set /a num!lines!_%%i=%%num!SN1!_%%i%%+%%num!lines!_!SN2!%%
             call set num=%%num!lines!_%%i%%
        )
    )
)
if %lines% lss %1 goto loop
cls
echo.&echo.&echo.
echo      在这个表格中,第 %1 行第 %2 列上的数字为 %num%
echo.
pause
goto begin

作者: scriptor     时间: 2007-2-24 11:06
被你先写了代码

那天我刚好回家了
又不能上网

今天我贴出来
看一看
评一评

呵呵....
作者: scriptor     时间: 2007-2-24 11:28

echo off
setlocal enabledelayedexpansion
cls
:l
echo %time%
set a[1][1]=1
for /l %%i in (1,1,9) do (
      set /a n=%%i-1
for /l %%j in (1,1,9) do (
   set /a m=%%j-1
   if not defined a[%%i][%%j] set /a a[%%i][%%j]=a[%%i][!m!]+a[!n!][%%j]
)
)
echo %time%
echo.
echo                      杨辉三角(9*9阶)
for /l %%i in (1,1,9) do (
  for /l %%j in (1,1,9) do (
    set/p=   !a[%%i][%%j]!<nul
     if %%j equ 9 echo.&echo.
))


只是因为排版麻烦点
没有写代码了

请原谅,同时请自己改写输出段代码。

[ Last edited by scriptor on 2007-2-23 at 10:38 PM ]
作者: scriptor     时间: 2007-2-24 11:34

若想输出15*15阶的

只要将所有的(1,1,9)改为(1,1,15),

同时将if %%j equ 9 中的 9 改为15即可


作者: scriptor     时间: 2007-2-24 11:37
这个bat算15*15阶的

运算时间不大于0.10秒(10毫秒)
作者: slore     时间: 2007-2-24 14:09
三角形第n行第r个:P<n,r>=C<n,r-1>
表格<i,j>位置数值K<i,j>=P<i+j-2,j>=C<i+j-2,j-1>

VBS:

  Quote:
Dim Hor, Ver, CH, CV, Result
Hor = Inputbox("输入横坐标:", , "13")
Ver = Inputbox("输入纵坐标:", , "15")

CH = Cint(Hor) + Cint(Ver) - 2
If Cint(Hor) > Cint(Ver) Then CV = Cint(Hor) - 1 Else CV = Cint(Ver) - 1
S = CV
Result = 1
For i = CH To CH - CV + 1 Step -1
If S = 0 Then Result = Result * i Else Result = Result * i / S: S = S - 1
Next
Msgbox "结果为:" & Result, , "所求值为:C(" & CH & "," & CV & ")"

Bat:

  Quote:

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p Hor=所求数的横坐标
  4. set /p Verizon=所求数的纵坐标

  5. set /a CH=%Hor%+%Verizon%-2


  6. if %Hor% GTR %Verizon% (set /a CV=%Hor%-1) else (set /a CV=%Verizon%-1)

  7. echo 所求值为:C^<%CH%,%CV%^>
  8. set /a ForTime=%CH%-%CV%+1
  9. set Final=1
  10. set /a S=%ForTime%
  11. for /l %%k in (%CH%,-1,%ForTime%) do (
  12. set /a Final=!Final!*%%k
  13. set /a Final=!Final!/%S%
  14. if %S% NEQ 0 set /a %S%=%S%-1
  15. )
  16. echo K %Hor%,%Verizon%的值是:%Final%
  17. pause>nul

这个P的代码是我的思路,但是我对P不熟悉还,if的判断大小的句子不成立!!!我也不知道怎么回事,谁把这里改改就好了。

我这个不是输出表格,是直接计算i行j列的数据。

[ Last edited by slore on 2007-2-24 at 01:14 AM ]
作者: slore     时间: 2007-2-24 14:29


  Quote:
Originally posted by scriptor at 2007-2-23 22:34:

若想输出15*15阶的

只要将所有的(1,1,9)改为(1,1,15),

同时将if %%j equ 9 中的 9 改为15即可


echo off
setlocal enabledelayedexpansion
cls
:l
set k=15

echo %time%
set a[1][1]=1
for /l %%i in (1,1,%K%) do (
      set /a n=%%i-1
for /l %%j in (1,1,%K%) do (
   set /a m=%%j-1
   if not defined a[%%i][%%j] set /a a[%%i][%%j]=a[%%i][!m!]+a[!n!][%%j]
)
)
echo %time%
echo.
echo                      杨辉三角(%K%*%K%阶)
for /l %%i in (1,1,%K%) do (
  for /l %%j in (1,1,%K%) do (
    set/p=   !a[%%i][%%j]!<nul
     if %%j equ %K% echo.&echo.
))

pause>nul
不就好了?刚才用50试了下,6秒,100……等了不知道多少时间(不是很长,但是CPU使用率……)

用脚本算了下....1000,溢出=。=
600都溢出……
500可以了。。。算这些都是瞬间……不过是6.76396999362954E+298这种的格式,毕竟太长了……
作者: oilio     时间: 2007-2-24 23:53
没上过高中啊,不懂函数啊啊,郁闷。。。
作者: gne3     时间: 2007-2-25 00:48

作者: qjbm     时间: 2007-2-26 22:50
19F的VBS是正解.
If S = 0 Then Result = Result * i Else Result = Result * i / S: S = S - 1
转换成批处理好象不是
(
set /a Final=!Final!*%%k
set /a Final=!Final!/%S%
if %S% NEQ 0 set /a S=%S%-1
)
感觉上应该是:
(
IF %S% EQU 0 set /a Final=!Final!*%%k ELSE (
set /a Final=!Final!*%%k/%S%
set /a S-=1
)
)
可是调试了半天,不得正果.

------------------------------
闲聊几句:

楼上的gne3兄,帖帖留名啊!PFPF!!!
几天没来,P区快成水区了.

[ Last edited by qjbm on 2007-2-26 at 09:53 AM ]