标题: [讨论][共同参与]求表格中数的规律[挑战分割法算法极限]
[打印本页]
作者: 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: |
- @echo off
- setlocal enabledelayedexpansion
- set /p Hor=所求数的横坐标
- set /p Verizon=所求数的纵坐标
- set /a CH=%Hor%+%Verizon%-2
- if %Hor% GTR %Verizon% (set /a CV=%Hor%-1) else (set /a CV=%Verizon%-1)
- echo 所求值为:C^<%CH%,%CV%^>
- set /a ForTime=%CH%-%CV%+1
- set Final=1
- set /a S=%ForTime%
- for /l %%k in (%CH%,-1,%ForTime%) do (
- set /a Final=!Final!*%%k
- set /a Final=!Final!/%S%
- if %S% NEQ 0 set /a %S%=%S%-1
- )
- echo K %Hor%,%Verizon%的值是:%Final%
- 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 ]