回 帖 发 新 帖 刷新版面

主题:6道编程题(做出一道加10分)

(1)从键盘输入两个自然数N,R(N>R),要求输出从N到1中按降序顺序取R个自然数的所有组合和个数。
例如:    输入:    N=5,R=3
         输出:    543,542,541,532,531,521,432,431,421,321
                  Total=10





(2)有3N个花盆,红色、蓝色、黄色各N个,按任意顺序排成一行。编程将各花盆按红、黄、蓝;红、黄、蓝;……红、黄、蓝的顺序排列,且要求花盆之间交换的次数最少。数字1表示红花盆,2表示黄花盆;3表示蓝花盆。要求输出每次交换后的状态和最少交换的次数。





(3)有2N十1个方格,左、右两边各放N个“+”子和N个“*”子。
例如N=4时,如下图所示:

|+|+|+|+| |*|*|*|*|       '   "|"用来分栏," "表示一个空格

试编程打印出用最少步数将上图中的“+”子和“。”子的位置进行交换的步骤。
移动规则如下:
l)一次只能移动一个棋子;
2)棋子可以向空格中移动,也可以跳过对方的一个棋子进人空格,但不能向后跳,也不能跳过两个棋子。





(4)有N枚硬币,将其按1,2,3,…,N编号排列(N>2),且正面都朝上。现从硬币2开始把编号为2的倍数的硬币翻一个面,再从硬币3开始把编号为3的倍数的硬币翻一个面,接着从硬币4开始把编号为4的倍数的硬币翻一个面。如此类推。直到最后将N号硬币翻一个面。问最后哪些硬币为正面朝上。编程,当从键盘输人N后,则输出结果是哪些硬币。





(5)某人去书店买书,他选中了六本书,价格分别为A、B、C、D、E、F,但他只带了50元钱。问怎样买法使总钱数最接近50元。A、B、C、D、E、F均由键盘输入。





(6)火车从始发站(称为第1站)开出,在始发站上车的人数为A;然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为A人。从第3站起(包括第3站)上、下车的人数有一定的规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第N-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为A,最后一站下车的人数是M(全部下车)。请编程求出从X站开出时车上的人数是多少?输入为:A,N,M和X(N,X均小于23);输出为:X站开出时车上的人数。

回复列表 (共20个回复)

11 楼

[quote]算了,一并说吧,
第一题在穷举的过程的加多个限制条件.

第三题,如果你不想穷举,那么就要采取每次对每种情况进行策略,刚巧以前解过这题,
#include&nbsp;<iostream.h>
const&nbsp;int&nbsp;Max=11;&nbsp;&nbsp;//数字随你改2N+1
int&nbsp;t[Max];
int&nbsp;count=0;
void&nbsp;Init()
{
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<Max/2;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t[i]=-1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t[Max-i-1]=1;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
void&nbsp;output()
{
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<Max;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(t[i]==-1)&nbsp;cout<<"a&nbsp;";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(t[i]==1)&nbsp;cout<<"b&nbsp;";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;cout<<"&nbsp;&nbsp;";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;cout<<endl;
}
void&nbsp;change(int&nbsp;a,&nbsp;int&nbsp;b)
{
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;temp=t[a];
&nbsp;&nbsp;&nbsp;&nbsp;t[a]=t[b];&nbsp;t[b]=temp;
}
int&nbsp;condition()
{
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sum1=0,&nbsp;sum2=0;
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<Max/2;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum1+=t[i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2+=t[Max-i-1];
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(sum1&nbsp;==&nbsp;Max/2)&nbsp;&&&nbsp;(sum2&nbsp;==&nbsp;-sum1))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;
}
void&nbsp;a_jump(int&nbsp;&flag)
{
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<Max-2;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;t[i]==-1&nbsp;&&&nbsp;t[i+1]==1&nbsp;&&&nbsp;t[i+2]==0&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;change(i,i+2);&nbsp;output();&nbsp;count++;&nbsp;flag=0;}
}
void&nbsp;b_jump(int&nbsp;&flag)
{
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<Max-2;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;t[i]==0&nbsp;&&&nbsp;t[i+1]==-1&nbsp;&&&nbsp;t[i+2]==1&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;change(i,i+2);&nbsp;output();&nbsp;count++;&nbsp;flag=0;}
}
void&nbsp;a_move(int&nbsp;&flag)
{
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<Max-1;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;t[i]==-1&nbsp;&&&nbsp;t[i+1]==0&nbsp;&&&nbsp;(i==0&nbsp;||&nbsp;t[i-1]!=t[i+2]&nbsp;))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;change(i,&nbsp;i+1);&nbsp;output();&nbsp;count++;&nbsp;flag=0;}
}
void&nbsp;b_move(int&nbsp;&flag)
{
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<Max-1;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;t[i]==0&nbsp;&&&nbsp;t[i+1]==1&nbsp;&&&nbsp;(i==Max-2&nbsp;||&nbsp;t[i-1]!=t[i+2]&nbsp;))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;change(i,&nbsp;i+1);&nbsp;output();&nbsp;count++;&nbsp;flag=0;}
}
void&nbsp;fun()
{
&nbsp;&nbsp;&nbsp;&nbsp;Init();
&nbsp;&nbsp;&nbsp;&nbsp;output();
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;flag;
&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;condition()&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flag)&nbsp;a_jump(flag);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flag)&nbsp;b_jump(flag);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flag)&nbsp;b_move(flag);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flag)&nbsp;a_move(flag);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;cout<<Max-1<<"个字母时,"<<endl;
&nbsp;&nbsp;&nbsp;&nbsp;cout<<"一共最少需移动"<<count<<"次"<<endl;
}
void&nbsp;main()
{
&nbsp;&nbsp;&nbsp;&nbsp;fun();
}


第四题和第六题模拟其程,第六题在模拟后可采取枚举的方法求解.

第五题用动态规划.[/quote]

12 楼

(1)
DECLARE SUB jx (i)
CLS
DIM SHARED n, m, S
INPUT "N,M="; n, m       '在N个元素中选M个数组合
DIM SHARED A(n)
S = 0
jx (1)
PRINT S
END

SUB jx (i)
FOR j = i TO n
A(i) = j: F = -1
FOR K = 1 TO i - 1
IF j <= A(K) THEN F = 0: EXIT FOR  '如果此元素比之前元素小或相等,则不要
NEXT K
IF F THEN
IF i < m THEN    '如果不满数,就用递归再找下一个元素
jx (i + 1)
ELSE             '如果满数,就输出一趟组合
S = S + 1
FOR K = 1 TO m
PRINT A(K);
NEXT K: PRINT ,
END IF
END IF
NEXT j
END SUB
(2)
CLS
N = 3
DIM A(100)
FOR I = 1 TO N: INPUT A(I): S = S + A(I): NEXT I
P = S / N: A = 1: B = N
FOR I = 1 TO N: A(I) = A(I) - P: NEXT I
WHILE A < N AND A(A) = 0: A = A + 1: WEND
WHILE B > 0 AND A(B) = 0: B = B - 1: WEND
WHILE A < B
A(A + 1) = A(A + 1) + A(A): A(A) = 0: A = A + 1: K = K + 1
WHILE A < N AND A(A) = 0: A = A + 1: WEND
WEND
PRINT K
END
(3)
(4)
(5)
(6)
CLS
INPUT A
INPUT N
INPUT M
INPUT X
DIM A(N), B(N), X(N)
A(1) = A: B(1) = 0: X(1) = A: X(2) = A
DO
S = S + 1
A(2) = S: B(2) = 2
FOR I = 3 TO N - 1
A(I) = A(I - 1) + A(I - 2)
B(I) = A(I - 1)
X(I) = X(I - 1) + A(I) - B(I)
NEXT I
IF X(N - 1) = M THEN PRINT X(X): END
LOOP
END

13 楼

(2)
cls
input n
for i=1 to n:a(i)=1:next i
for i=2 to n
for j=i to i*i step i
a(j)=1-a(j)
next j,i
for i=1 to n:print a(i):next i
end

14 楼

我只会1、4、5、6题,下面给出四道题的程序,还有,你说好每道题10分的,40分可一分不能少啊!
第1题:
CLS
INPUT n, r
DIM a(r): FOR i = 1 TO r: a(i) = i: NEXT i
DO
  s = s + 1: FOR j = 1 TO r: PRINT n + 1 - a(j); : NEXT j
  i = r: PRINT
  DO
    a(i) = a(i) + 1
    IF i < r THEN FOR j = i + 1 TO r: a(j) = a(j - 1) + 1: NEXT j
    IF a(i) <= n + i - r THEN EXIT DO
    i = i - 1
    IF i = 0 THEN PRINT "Total:"; s: END
  LOOP
LOOP
END

15 楼

第二题:
CLS
INPUT n
DIM a(n): FOR i = 1 TO n: a(i) = 1: NEXT i
FOR i = 1 TO n
    FOR j = i TO n STEP i
        a(j) = 1 - a(j)
    NEXT j
NEXT i
FOR i = 1 TO n
    IF a(i) = 1 THEN PRINT i;
NEXT i
END

16 楼

刚才我说错了,应该是第4题.

17 楼

no.1
input N,R
if N>207 or R>N then end
for i=1 to N
    s$=chr$(48+i)+s$
next
s1$=right$(s$,R)
s2$=s1$
do
  c=c+1
  print s2$,
  s2$=nextzh$(s$,s2$)
loop until s2$=s1$
print "Total:"; c
end

function nextzh$(a$,b$)
for i=1 to len(b$)
  if instr(1,a$,mid$(b$,i,1))>i then
     mid$(b$,1,i)=mid$(a$,instr(1,a$,mid$(b$,i,1))-i,i)
     exit for
  endif
next
if i>len(b$) then b$=right$(a$,len(b$))
nextzh$=b$
end function[/quote]

18 楼

no.2
defint a-z
randomize timer
n = 25 * rnd + 2
s$ = space$(3 * n)
for i = 1 to 3
    for j = 1 to n
      do
        k = 3 * n * rnd + 1
        if k > 3 * n then k = 3 * n
        if mid$(s$,k,1)=chr$(32)then mid$(s$,k,1)=chr$(48+i)else k=-1
      loop while k = -1
    next
next

cls
print s$

for i = 1 to 3 * n
    a = val(mid$(s$, i, 1))
    if (a mod 3) <> (i mod 3) then
       q = q + 1
       for j = i + 1 to 3 * n
           b = val(mid$(s$, j, 1))
           if ((b mod 3) <> (j mod 3)) then
              e = j
              if (b mod 3) = (i mod 3) then exit for
           end if
       next
       c$ = mid$(s$, e, 1)
       mid$(s$, e, 1) = mid$(s$, i, 1)
       mid$(s$, i, 1) = c$
       print s$
    end if
next
print q[/quote]

19 楼


20 楼

V

我来回复

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