回 帖 发 新 帖 刷新版面

主题:这是我们的竞赛题,看你们能做出来几道

(各题加分:20 10 20 30)
1、字符串匹配问题:输入一个带括号的字符串,(四种括号:( ) < > [ ] { })如果
括号全部成对出现,并且顺序正确,称为匹配,否则不匹配。
示例:
匹配的字符串:(ABC[D{E}]FGH)、<ERROR>、(<[1234{5}]>)
不匹配的字符串:(34789、(A[BC)DEF]、(<6667}
如果输入的字符串没有括号,如ABCD,则让你重新输入。
2、任何一个数的三次方都能表示成一串奇数的和,如3^3=11+9+7,现输入一个数,把这串奇数打印出来。
如:输入4,输出19+17+15+13=64=4^3。
3、有N个人要接受检测,每个人检测的时间为3-7分钟,现有三个检测员同时检测,求要多长时间。
4、输入N,输出N!的最后一位非0的数字(10000<N<10000000000)。

回复列表 (共67个回复)

21 楼

前提:n在long int范围内!
超过出错!(稍微作调整即可)

22 楼

1.郑重声明: 经过验证,我在19楼的猜想是错误的.

2.近来看到那么多人在发言回复,
  这张贴这个问题再次引起我的兴趣,
  因为个人习惯问题,所以我一头钻进牛角尖去,
  不到长江不死心,非要自己研究一下,
  没到走头无路的时候不去百度和狗狗.

3.我针对数字的特点得出以下结论,
  (只是中间过程,对解题有帮助,但我尚未找到答案)

A. 在阶乘当中,引起尾数是0的只有三个数,0,2,5
   0可以忽略不计
   每10个数里面只有一到两个5
   每10个数里面却有四到五个2
   所以因数积聚速度5不够2快
   逢5,必被2的因子积聚化成0
   而积聚的因子2却因为找不到对应的5,不断的超负荷积聚,
   导致阶乘得数去0后的最后一个数字,
   必将是偶数(2468的其中一个)
   这是第一个特点.

B. 在2468不断变化的过程中,我们来看一下不同的尾数对阶乘的影响
   1  这很明显,肯定与上一个阶乘积的尾数相同,我们称之为第一种情形( I   同上 )
   2  直观看待,上一个得数乘以2,(废话),我们称之为第二种情形      ( II  前双 )
   3  其实可以想像得到,2*3=6,6与任何偶数2468相乘,尾数不变,
        大家可以自己试试,我们称之为第三种情形                   ( III 同前 )
   4  与其他偶数相乘的结果是互补成十,我们称之为第四种情形       ( IIII补十 )
   6  其实前面都已经说过了,6与任何偶数..........................( I   同上 )
   7  经过验证,7其实与2的特性是相同的...........................( II  前双 )
   8  7*8=56,又看到6了..........................................( III 同前 )
   9  与4相同...................................................( IIII补十 )
   0  关键看具体的尾数进行运算,不能归入四种情形.

C. 在上面我没有讲到5,是因为5这个数比较特殊,会补因子2化成0,
   有多少个5,就化多少个2,
   所以还得分解5出来,分解一次,前一个数就减半,
       这个减半还不是一般的减半,2减半不会是1,而是6,因为尾数必定是偶数,
       所以顺序就是8-4,4-2,2-6,6-8
.................
未完待续........

23 楼

消化完5后,再相乘得尾数.

现在得出结论就是,数列受5与0所影响,
只要能得到尾数为5与0的阶乘尾数,其实数值便能得到其尾数:

中间结论:

尾数:   阶乘尾数

0       x
1         x
2         2x
3         x
4         (10-x)
5       y
6         y
7         2y
8         y
9         (10-y)

关键: 计算因子5的影响与作用.

24 楼

我竞赛的时候,怎么有4题呀?

25 楼

下面给出1-3题的程序,第4题就是18楼的.
第1题:
CLS
DATA  (,),[,],{,},<,>
1 INPUT a$: RESTORE: l = LEN(a$): k = 0: REDIM f(l)
FOR i = 1 TO l
    RESTORE: m$ = MID$(a$, i, 1)
    FOR j = 1 TO 8
        READ b$
        IF m$ = b$ THEN k = k + 1: f(k) = j
    NEXT j
NEXT i
IF k = 0 THEN PRINT "ERROR!": GOTO 1
s1 = 0: s2 = 0
FOR i = 1 TO k
    IF f(i) MOD 2 = 0 THEN s2 = s2 + 1 ELSE s1 = s1 + 1
    IF s2 > s1 THEN PRINT "NO": END
NEXT i
IF s1 <> s2 THEN PRINT "NO": END
DIM a(k): FOR i = 1 TO k: a(i) = 1: NEXT i
FOR i = 1 TO k
    IF f(i) MOD 2 = 0 THEN
       FOR j = i - 1 TO 1 STEP -1
           IF f(j) = f(i) - 1 AND a(j) = 1 THEN a(i) = 0: a(j) = 0: EXIT FOR
       NEXT j
       IF (i - j) MOD 2 = 0 THEN PRINT "NO": END
    END IF
NEXT i
PRINT "YES"
END
第2题:
CLS
INPUT n
s = 1: k = 4
FOR i = 1 TO n - 1
    s = s + k: k = k + 2
NEXT i
PRINT s;
FOR i = 1 TO n - 1
    s = s - 2
    PRINT "+"; s;
NEXT i
PRINT "="; n; "^ 3 ="; n ^ 3
END
第3题:
CLS
RANDOMIZE TIMER
INPUT n: DIM a(3)
FOR i = 1 TO n
    t = RND * 4.000001 + 3
    s = INT(RND * 3) + 1
    a(s) = a(s) + t
NEXT i
maxs = 1
FOR i = 2 TO 3
    IF a(i) > a(maxs) THEN maxs = i
NEXT i
PRINT a(maxs) / 3600; "hours"
END
请大家想想有没有更好的方法.

26 楼

我试过你的程序了18楼,但我没弄清楚是怎么回事,
(当然了,我甚至连自己的代码都搞不清楚是怎么回事呢,更何况是别人的)

f(179)=4
f(180)=4     '就在这个位置开始就不准了.

27 楼

我重新按照上面的思路做了程序,
但计算范围达不到题目要求的10G,算到八位数时,已经开始吃力了.

DECLARE FUNCTION f& (a&, b&)
DECLARE FUNCTION r& (m&)
DIM SHARED p&(3), q&(8)
p&(0) = 2
p&(1) = 6
p&(2) = 8
p&(3) = 4
q&(2) = 0
q&(4) = 3
q&(6) = 1
q&(8) = 2
PRINT r&(1000006)

FUNCTION f& (a&, b&)
    u& = a&
    t& = 1
    DO WHILE u& MOD 5 = 0
       t& = t& + 1
       u& = u& \ 5
    LOOP
    f& = (p&((q&(b&) + t&) MOD 4) * u&) MOD 10
END FUNCTION

FUNCTION r& (m&)
n& = 4
s& = 4
j& = m& \ 5
FOR i& = 1 TO j&
    s& = f&(i&, s&)
    n& = i& * 5 + 4
    s& = 10 - s&
NEXT
SELECT CASE n& - m&
CASE 1, 3, 4: s& = 10 - s&
CASE 2: s& = (10 - s&) * 2 MOD 10
END SELECT
r& = s&
END FUNCTION

28 楼

1
CLS
INPUT A$: DIM A$(LEN(A$))
FOR I = 1 TO LEN(A$)
  IF MID$(A$, I, 1) = "(" OR MID$(A$, I, 1) = ")" OR MID$(A$, I, 1) = "<" OR MID$(A$, I, 1) = ">" OR MID$(A$, I, 1) = "[" OR MID$(A$, I, 1) = "]" OR MID$(A$, I, 1) = "{" OR MID$(A$, I, 1) = "}" THEN q = 1
NEXT I
IF q = 0 THEN PRINT "重输": END
FOR I = 1 TO LEN(A$)
  IF MID$(A$, I, 1) = "(" OR MID$(A$, I, 1) = ")" OR MID$(A$, I, 1) = "<" OR MID$(A$, I, 1) = ">" OR MID$(A$, I, 1) = "[" OR MID$(A$, I, 1) = "]" OR MID$(A$, I, 1) = "{" OR MID$(A$, I, 1) = "}" THEN H = H + 1: A$(H) = MID$(A$, I, 1)
NEXT I: IF H MOD 2 <> 0 THEN PRINT "不匹配"; : END
FOR I = 1 TO H \ 2
  IF A$(I) = "}" OR A$(I) = "]" OR A$(I) = ">" OR A$(I) = ")" THEN PRINT "不匹配": END
NEXT I
FOR I = 1 TO H
  IF A$(I) = ")" THEN A$(I) = "("
  IF A$(I) = "]" THEN A$(I) = "["
  IF A$(I) = "}" THEN A$(I) = "{"
  IF A$(I) = ">" THEN A$(I) = "<"
NEXT I
FOR I = 1 TO H \ 2
  IF A$(I) <> A$(H + 1 - I) THEN PRINT "不匹配": END
NEXT I
PRINT "匹配"
END


29 楼

1
CLS
INPUT A$: DIM A$(LEN(A$))
FOR I = 1 TO LEN(A$)
  IF MID$(A$, I, 1) = "(" OR MID$(A$, I, 1) = ")" OR MID$(A$, I, 1) = "<" OR MID$(A$, I, 1) = ">" OR MID$(A$, I, 1) = "[" OR MID$(A$, I, 1) = "]" OR MID$(A$, I, 1) = "{" OR MID$(A$, I, 1) = "}" THEN q = 1
NEXT I
IF q = 0 THEN PRINT "重输": END
FOR I = 1 TO LEN(A$)
  IF MID$(A$, I, 1) = "(" OR MID$(A$, I, 1) = ")" OR MID$(A$, I, 1) = "<" OR MID$(A$, I, 1) = ">" OR MID$(A$, I, 1) = "[" OR MID$(A$, I, 1) = "]" OR MID$(A$, I, 1) = "{" OR MID$(A$, I, 1) = "}" THEN H = H + 1: A$(H) = MID$(A$, I, 1)
NEXT I: IF H MOD 2 <> 0 THEN PRINT "不匹配"; : END
FOR I = 1 TO H \ 2
  IF A$(I) = "}" OR A$(I) = "]" OR A$(I) = ">" OR A$(I) = ")" THEN PRINT "不匹配": END
NEXT I
FOR I = 1 TO H
  IF A$(I) = ")" THEN A$(I) = "("
  IF A$(I) = "]" THEN A$(I) = "["
  IF A$(I) = "}" THEN A$(I) = "{"
  IF A$(I) = ">" THEN A$(I) = "<"
NEXT I
FOR I = 1 TO H \ 2
  IF A$(I) <> A$(H + 1 - I) THEN PRINT "不匹配": END
NEXT I
PRINT "匹配"
END

30 楼

[em2][em2][em13][em18]

我来回复

您尚未登录,请登录后再回复。点此登录或注册