回 帖 发 新 帖 刷新版面

主题:删除数问题

删除数问题。键盘输入一个高精度的正整数n(<=240位),去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小。

输入:


输出:
最后剩下的最小数
{样例输入}
178543
4
{样例输入}
13

回复列表 (共12个回复)

沙发

我觉得应该用琢一试探法。
“zhu 渐”的zhu 用五笔怎么打?[em8]

板凳

渐 ilr

1. 把所有数字从小到大排列好
2. 删掉最后的S个数字就行了
3. 没有第3了,简单得只有两步

3 楼

好象不对呀,
例如:n=6587
s=1
按照上述办法,是删除8呀,但并没达到最小的目的。
还有就是删后,按原序,从左到右排。

4 楼

怎么没人回了,正请教大家呢!

5 楼

你想一想每个能删除数的范围是什么呢……???删除的原则是什么呢??不是很难的题

6 楼

下面的程序显然不是什么最优解,不过应该很好理解
就是 把较大的数转化为 空格
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 楼

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 楼

谢谢大家的帮助,7楼的程序很好,但六楼的还是有错误。
如输入5879,1
结果却是587,(应该是579)

9 楼

唉,我都不明白为什么你们不明白我说过的话?


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 楼

如果按你说的什么删后从左到右排,
就是说不改变剩下的其他数字的顺序的话,
更简单.从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$

我来回复

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