主题:删除数问题
163111511
[专家分:90] 发布于 2005-07-20 20:31:00
删除数问题。键盘输入一个高精度的正整数n(<=240位),去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小。
输入:
n
s
输出:
最后剩下的最小数
{样例输入}
178543
4
{样例输入}
13
回复列表 (共12个回复)
沙发
prairiewolf [专家分:290] 发布于 2005-07-20 21:05:00
我觉得应该用琢一试探法。
“zhu 渐”的zhu 用五笔怎么打?[em8]
板凳
moz [专家分:37620] 发布于 2005-07-20 22:27:00
渐 ilr
1. 把所有数字从小到大排列好
2. 删掉最后的S个数字就行了
3. 没有第3了,简单得只有两步
3 楼
163111511 [专家分:90] 发布于 2005-07-21 08:21:00
好象不对呀,
例如:n=6587
s=1
按照上述办法,是删除8呀,但并没达到最小的目的。
还有就是删后,按原序,从左到右排。
4 楼
163111511 [专家分:90] 发布于 2005-07-21 14:00:00
怎么没人回了,正请教大家呢!
5 楼
davidw017 [专家分:4170] 发布于 2005-07-21 18:01:00
你想一想每个能删除数的范围是什么呢……???删除的原则是什么呢??不是很难的题
6 楼
飞鸟12 [专家分:2830] 发布于 2005-07-21 20:13:00
下面的程序显然不是什么最优解,不过应该很好理解
就是 把较大的数转化为 空格
DO
INPUT n$, s
n.len = LEN(n$)
LOOP UNTIL s <= n.len
x = 1
max$ = "9"
DO
FOR j = 1 TO n.len
temp$ = MID$(n$, j, 1)
IF temp$ = max$ THEN
MID$(n$, j, 1) = " "
x = x + 1: IF x > s THEN EXIT DO
END IF
NEXT j
max$ = CHR$(ASC(max$) - 1)
LOOP
PRINT " "; n$
PRINT " ";
FOR j = 1 TO n.len
temp$ = MID$(n$, j, 1)
IF temp$ <> " " THEN PRINT temp$;
NEXT j
PRINT
程序 只是把数字串中的最大数删除了
看来 并不符合题义
7 楼
zqnhlm [专家分:780] 发布于 2005-07-22 10:55:00
CLS
DIM n AS STRING
DIM m AS INTEGER
DIM i AS INTEGER
DIM weizhi AS INTEGER
DIM x AS STRING
DIM y AS STRING
INPUT "n=", n
INPUT "m=", m
DIM a(1 TO LEN(n) - m) AS INTEGER
weizhi = 1: a(weizhi) = 1
y = "a"
DO WHILE 3
IF weizhi < LEN(n) - m THEN
weizhi = weizhi + 1
a(weizhi) = a(weizhi - 1) + 1
ELSE
x = ""
FOR i = 1 TO LEN(n) - m
x = x + MID$(n, a(i), 1)
NEXT i
IF x < y THEN y = x
o: a(weizhi) = a(weizhi) + 1
IF a(weizhi) > m + weizhi THEN
IF weizhi > 1 THEN
weizhi = weizhi - 1
GOTO o
ELSE
EXIT DO
END IF
END IF
END IF
LOOP
PRINT y
END
8 楼
163111511 [专家分:90] 发布于 2005-07-22 11:33:00
谢谢大家的帮助,7楼的程序很好,但六楼的还是有错误。
如输入5879,1
结果却是587,(应该是579)
9 楼
moz [专家分:37620] 发布于 2005-07-22 11:53:00
唉,我都不明白为什么你们不明白我说过的话?
dim s(240) as string *1
print "请输入数字(按回车结束):";
locate ,,1
'输入
do
do:k$=inkey$:loop while k$=""
select case k$
case chr$(27):system
case chr$(13):exit do
case "0" to "9"
n=n+1
print k$;
s(n)=k$
case else:beep
end select
loop until k$=chr$(13)
locate ,,0
'排序,在这里只用最简单的排序就可以了.
for i=1 to (n-1)
for j=(i+1) to n
if s(j)<s(i) then swap s(j),s(i)
next j,i
'输入要删除S个数字的个数
print "要删除多少位数字? 请在 1 到";n;"的范围内";
input s
'输出结果
n=n-s
print "得到结果是:"
for i=1 to n
s(i);
next
10 楼
moz [专家分:37620] 发布于 2005-07-22 12:01:00
如果按你说的什么删后从左到右排,
就是说不改变剩下的其他数字的顺序的话,
更简单.从9删到0就可以了,在这里我用字符串
input "请输入少于240位的正整数:",Z$
input "请输入要删除的数字的个数:",S
d=9
do while s
i=instr(Z$,chr$(48+d))
if i then
Z$=left$(Z$,i-1)+mid$(Z$,i+1)
s=s-1
else
d=d-1
if d<0 then exit do
endif
loop
print "得出结果是:";Z$
我来回复