博文

约瑟夫问题(另类)(2007-12-16 21:02:00)

摘要:约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒.

约瑟夫问题  
    这是一个非常经典的问题:n个骑士编号1,2,...,n,围坐在圆桌旁,编号为k的骑士从1开始报数,报到m的骑士出列,然后下一个位置再从1开始报数,找出最后留在圆桌旁的骑士编号。

 
强强估计是为了活跃一下QB版块,发了这么一个贴:
http://www.programfan.com/club/post-254722.html
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

我也就改善了一下别人的代码,最后实在忍不住看看是不是可以另辟蹊径,
结果,我还真的写出来了,完全是自己的经验之作.绝无抄袭.
也算是一个小小的成就,值得自我再次陶醉一下.
但具体理论原理,我还真的说不出来,完全是形而上学而成的.
持怀疑态度的尽管一试,我是再没有精力去研究其中的道理了,
有兴趣的有慧眼的,还请指点一二:

QB,VB代码:
Function m3(n, m)
a = 1
s = 1
m1 = m - 1
Do While a < n
    b = a - s
    If b < m1 Then
        a =......

阅读全文(3005) | 评论:0

VB里的MKI(2006-11-29 14:10:00)

摘要:概要 loadTOCNode(1, 'summary'); Visual Basic for Windows 不支持 MKx $ 和早期版本的 Microsoft QuickBasic 和基本专业开发系统 (PDS) 中找到 MS-DOS 转换函数 CVx 系列。 但是, 可编写函数提供此支持使用由 Windows 3.1 hmemcpy API 例程。

本文提供示例例程, 模拟 MKI $ MKL $、 MKS $、 MKD $、 CVI、 CVL、, CVS 和 CVD 函数。 回到顶端 更多信息 loadTOCNode(1, 'moreinformation'); 通过放置 ASCII 值是每个字节代表数字值成一个字符串 MKx $ 函数将数值转换为字符串。 Function Description --------- --------------------------------------------------------- MKI$ Converts an integer to a 2-byte string MKL$ Converts a long-integer to a 4-byte string MKS$ Converts a single precision variable to a 4-byte string MKD$ Converts a double-precision variable to an 8-byte string CVx 函数转换回数值用 MKx $ 函数创建字符串。 Function Description</H3> --------- --------------------------------------------------------- CVI Converts a 2-byte string created with MKI$ to an integer CVL Converts a 4-byte string created with MKL$ to a long integer CVS Converts......

阅读全文(3497) | 评论:1

QB 的 超长数值的简单运算(未包含小数点和符号计算)(2005-08-20 11:51:00)

摘要:很多人都会说到用数组来储存各位置上的数字,
而我觉得QB里的字符串特别是不定长字符串,
使用起来很方便,所以我很喜欢用QB的字符串函数
mid$(),instr()等等,方便快捷

不定长字符串最大可以去到32767个字符,
大概已经够用的了,还不够用的话,再定义一个字符数组
转换成十六进制来计算,每一个字符代替两位十六进制数字,够恐怖的了
我觉得我这辈子都不怎么会有这个机会用得上了,否则我该进天文学研究所去了.

DECLARE FUNCTION longx$ (a$, b$)  '乘法
DECLARE FUNCTION longqu$ (a$, b$) '除法
DECLARE FUNCTION longadd$ (a$, b$)'加法
DECLARE FUNCTION longsub$ (a$, b$)'减法
DECLARE FUNCTION cut0$ (a$)
DECLARE FUNCTION dao$ (a$)

FUNCTION cut0$ (a$)
c$ = a$
l% = LEN(c$)
DO UNTIL l% <= 1
   IF LEFT$(c$, 1) < "1" THEN
      l% = l% - 1
      c$ = RIGHT$(c$, l%)
   ELSE
      EXIT DO
   END IF
LOOP
cut0$ = c$
END FUNCTION

FUNCTION dao$ (a$)
b$ = a$
l% = LEN(b$)
FOR i% = 1 TO l% \ 2
  k$ = MID$(b$, ......

阅读全文(3954) | 评论:2

QBASIC 替换递归的快速排序(2005-08-18 18:28:00)

摘要:m% = 16000
DIM SHARED s(m%)
RANDOMIZE TIMER
FOR i% = 1 TO m%
    s(i%) = RND
NEXT

QSort3 1, m%

调用排序

---------------------------------------------------
第一种: 标准的递归形式

SUB QuickSort (l%, h%)
IF l% < h% THEN
  IF h% - l% = 1 THEN
     IF s(l%) > s(h%) THEN SWAP s(l%), s(h%)
  ELSE
     r% = INT(RND * (h% - l% + 1)) + l%
     SWAP s(h%), s(r%)
     p = s(h%)
     i% = l%
     j% = h%
     DO
      DO WHILE (i% < j%) AND (s(i%) <= p)
         i% = i% + 1
      LOOP
      DO WHILE (j% > i%) AND (s(j%) >= p)
 ......

阅读全文(3450) | 评论:0

密码的单向函数(2005-08-17 15:06:00)

摘要:我对密码没有什么研究,只是听说有单向检测的密码函数,我就从字面上的解释去试试凭空想一个出来了.
1. 用键盘输入一串密码
2. 利用它的ASC码做运算
3. 利用ASC码乘上一个质数来计算一个值作为保存

初步的试算是:比如密码 "ABC"
储存一个密码值= A*2 + B*5 + C*7 +......

检查密码的时候依此计算与密码值比较是否相符.
但具体如何降低巧合的机率,还需要进一步的优化

input "请输入密码:",a$
m&=1
n$="  2  3  5  7  13 17 19 23 29 31 37 39 41 ......"
for i%=1 to len(a$)
   m&=m&+asc(mid$(a$,i%,1)*val(mid$(n$,i*3,3))
next
密码值=m&......

阅读全文(3390) | 评论:0

关于文本方式下屏幕内容的保存(2005-08-05 13:38:00)

摘要:我很少搞图形的,图形屏幕也就用那两句get,put来保存了,
我只是说说文本方式的保存。
因为以前为自己做程序的时候老是不知道该怎么办,
因为全屏幕需要处理的数据比较少,就先说说全屏幕处理了.

A 我第一次做的程序是用screen语句的
  保存
    dim s(25,80,1)
    for i=1 to 25
      for j=1 to 80
        s(i,j,0)=screen(i,j,0)
        s(i,j,1)=screen(i,j,1)
    next j,i
    恢复
    locate 1,1
    for i=1 to 25
      for j=1 to 80
        color s(i,j,1) mod 16, s(i,j,1)\16
        print chr$(s(i,j,0);
    next j,i

B   后面,我知道了&HB800,我就利用BSAVE,BLOAD了
    sub scrf(f$)
    def seg =&HB800
 ......

阅读全文(3466) | 评论:0

关于日期(公历)和星期几的问题(2005-08-03 11:47:00)

摘要:print "今天是星期";mid$("日一二三四五六",(Date2Number&(date$) mod 7)*2+1,2)

DEFLNG A-Z
FUNCTION Date2Number& (d$)
y = VAL(MID$(d$, 7, 4))
m = VAL(d$)
d = VAL(MID$(d$, 4, 2))
r = ((y MOD 4 = 0 AND y MOD 100 <> 0) OR (y MOD 400 = 0))
y = y - 1
Date2Number& = (y * 365 + y \ 4 - y \ 100 + y \ 400 + VAL(MID$("    0 31 59 90120151181212243273304334", m * 3, 3)) + r * (m > 1) + d)
END FUNCTION


deflng a-z
FUNCTION Number2Date$ (day&)
d$ = "00-00-0000"
y = day& / 365.254

DO
  n = day& - (y * 365 + y \ 4 - y \ 100 + y \ 400)
  IF n < 0 THEN y = y - 1
LOOP WHILE n < 0

y = y + 1
r = ((y MOD 4 = 0 AND y MOD 100 <> 0) OR (y MOD 400 = 0))

FOR m = 12 TO 1 STEP -1
k = VAL(MID$("    0 31 59 90120151181212243273304334", m * 3, 3)) + r * (m > 1)
......

阅读全文(4146) | 评论:4

关于质数(素数)(2005-08-03 11:39:00)

摘要:do
input Q&
if Q&=IsZhiShu&(Q&) then print Q&;"是质数"
loop while Q&



FUNCTION IsZhiShu& (a&)
f% = FREEFILE
OPEN "质数表" FOR RANDOM AS #f% LEN = LEN(a&)
IF LOF(f%) = 0 THEN
     z& = 2
     PUT #f%, 1, z&
     z& = 3
     PUT #f%, 2, z&
END IF
e& = LOF(f%) \ LEN(a&)
GET #f%, e&, z&
SELECT CASE a&
CASE IS <= 2
  IsZhiShu& = 2
CASE IS >= z&
  DO UNTIL z& >= a&
    DO
      z& = z& + 2
      q& = SQR(z&)
      i& = 2
      DO
        GET #f%, i&, k&......

阅读全文(3734) | 评论:0