主题:这是我们的竞赛题,看你们能做出来几道
Matodied
[专家分:7560] 发布于 2007-04-19 20:18:00
(各题加分: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 楼
knate [专家分:570] 发布于 2007-05-06 14:38:00
前提:n在long int范围内!
超过出错!(稍微作调整即可)
22 楼
moz [专家分:37620] 发布于 2007-05-06 21:52:00
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 楼
moz [专家分:37620] 发布于 2007-05-07 00:23:00
消化完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 楼
水清鱼读月 [专家分:0] 发布于 2007-05-07 14:11:00
我竞赛的时候,怎么有4题呀?
25 楼
Matodied [专家分:7560] 发布于 2007-05-07 14:14:00
下面给出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 楼
moz [专家分:37620] 发布于 2007-05-07 22:53:00
我试过你的程序了18楼,但我没弄清楚是怎么回事,
(当然了,我甚至连自己的代码都搞不清楚是怎么回事呢,更何况是别人的)
f(179)=4
f(180)=4 '就在这个位置开始就不准了.
27 楼
moz [专家分:37620] 发布于 2007-05-08 13:39:00
我重新按照上面的思路做了程序,
但计算范围达不到题目要求的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 楼
hhhchy [专家分:300] 发布于 2007-05-10 12:46:00
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 楼
hhhchy [专家分:300] 发布于 2007-05-10 12:47:00
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 楼
hhhchy [专家分:300] 发布于 2007-05-10 12:47:00
[em2][em2][em13][em18]
我来回复