oldice 发表于 2004-4-21 14:13:00

有趣的踩汽球问题.看看吧

谁能帮帮忙编出这个问题啊?
   儿童节时.两个人比赛踩汽球.汽球一百个.分别编号1~100.在相同的时间内.两个人一起去踩这100个汽球.他们的基数都为1.在踩了一个汽球后.乘上汽球的编号.再踩再乘.时间到后.两个把自己的乘到的结果报出来.分数高的人为胜.如果一方说慌.那就另一方胜了.
   但考虑到是否有人慌报数字的问题.先定义分数低的那个人是真的.因为他没必要说慌.
    因为两个人不可能踩同一个数字.所以可以根据把结果分解后的数字想比较.可以判断他们的结果有没有说慌.
    比如.A的结果是147;B的结果是49.那么.A只能是49*3,而B也只能是1*49.因为B没有说慌.所以.A说慌了.那就是B胜了.
    又如:A的结果是486.B的结果是81.那样的话.A除了分解为81*6外.还可以分解为9*54或者3*9*18等.而B.可以由1*81得到.也可以由3*27.A和B至少存在一组不重叠的编号.所以.分数高的A就胜了.
   具体输入输入如:
Input
343   49
3599   610
62       36

Output
49
610
62

唐明 发表于 2004-5-10 14:32:00

这个代码就你局的例子都没有问题
保存为.vbs文件

Function scanfnum(hfile)
'从文件中读取一个数字
Dim s, n, n_end
n = ""
s = ""
n_end = False
d_end = False
Do While Not (hfile.AtEndOfStream)
    s = hfile.read(1)
    Do While (s < "0" Or s > "9") And (Not (hfile.AtEndOfStream))
      If n_end = True Then
      d_end = True
      Exit Do
      End If
      s = hfile.read(1)
    Loop
    If d_end Then Exit Do
    If s >= "0" And s <= "9" Then
      n = n + s
      n_end = True
    End If
Loop
If n = "" Then scanfnum = "error" Else scanfnum = CInt(n)

End Function

Function truenum(n1, n2, vx)
'                      ↑存储分数的书组
'默认n1>n2
Dim p, v1, v2
v1 = n1
v2 = n2
'下面把v1拆份成为每个数字尽可能大,数量尽可能少的组合
p = 100
Do While v1 > 1 And p > 1
    If v1 Mod vx(p) = 0 Then
      v1 = v1 \ vx(p)
      vx(p) = 0'用过的数字设置0
    End If
    p = p - 1
Loop
'下面一样尝试把v2拆份成为每个数字尽可能大,数量尽可能少的组合,但是v1用过的数字不能再用
p = 100
Do While v2 > 1 And p > 1
    If vx(p) <> 0 Then
      If v2 Mod vx(p) = 0 Then
      v2 = v2 \ vx(p)
      vx(p) = 0
      End If
    End If
    p = p - 1
Loop
'查分成功则结果v2应该是1,如果v1占用了v2必需的数字就会拆份失败
If v2 = 1 Then truenum = 0 Else truenum = 1
End Function

Function startprc(n, inpath, outpath)
'               ↑气球个数
'                  ↑输入文件路径
'                           ↑输出文件路径
Dim nx(2), singlenum(), cnt
ReDim singlenum(n)

Set fso = CreateObject("scripting.filesystemobject")
If fso.fileexists(inpath) Then
    Set inf = fso.opentextfile(inpath)
    Set outf = fso.createtextfile(outpath, 1)
    Do While Not (inf.AtEndOfStream)
      For i = 1 To n
      singlenum(i) = i '写入每个球的分数
      Next
      '读取两个数
      nx(0) = scanfnum(inf)
      nx(1) = scanfnum(inf)
      If nx(0) <> "error" And nx(1) <> "error" Then
      If nx(0) < nx(1) Then
          '大叔在前
          nx(2) = nx(0)
          nx(0) = nx(1)
          nx(1) = nx(2)
      End If
      opp = truenum(nx(0), nx(1), singlenum)
      outf.writeline nx(opp)
      End If
    Loop
End If
End Function
'***************************
'这里开始运行
'***************************
startprc 100, "input.txt", "output.txt"




[此贴子已经被作者于2004-5-10 14:36:26编辑过]
页: [1]
查看完整版本: 有趣的踩汽球问题.看看吧