复试准备指二零零七到二零一二上机题
- 一群人(排列的编号从 1 到 N,N 可以设定)围成一圈,按一定规则出列。剩余的人仍然围成一圈,出列规则是顺着 1 到 N 的方向对圈内的人从 1 到 C 记数(C 可以设定)。圈内 记数为 C 的人出列。剩余的人重新计数。按上述规则,让圈内所有的人出列。请编程输出 出列编号的序列。
例:
若 N=3,C=1,则出列编号的序列为 1,2,3
若 N=3,C=2,则出列编号的序列为 2,1,3
# include <iostream>
using namespace std;
int main() {
int n, c;
while (cin >> n >> c) {
int out[1000] = {0};
int cnt = n; // 没有出列的人数
int num = 1; // 报数
int no = 0; // 排列编号
while (cnt) {
if (out[no] == 1) {
no = (no + 1) % n;
continue;
}
if (num == c) {
cout << no + 1 << ' ';
out[no] = 1;
num = 1;
cnt--;
}
else {
num++;
}
no = (no + 1) % n;
}
cout << endl;
}
return 0;
}
- 输入一个循环数组(数组的最后一个元素的下一元素为数组的第一个元素),依次打印出 数组中所有元素的下一个比这个元素更大的值(按数组下标大小搜寻,可以循环),如果不 存在更大的元素,打印-1。
例:
输入:
6
1 2 1 6 3 4
输出:2 6 6 -1 4 6
# include <iostream>
using namespace std;
int main() {
int n;
int a[1000];
while (cin >> n) {
int mmax = -1;
for (int i = 0; i < n; ++i) {
cin >> a[i];
if (a[i] > mmax) {
mmax = a[i];
}
}
for (int i = 0; i < n; ++i) {
if (a[i] == mmax) {
cout << -1 << ' ';
continue;
}
int next = (i + 1) % n;
while (1) {
if (a[i] < a[next]) {
cout << a[next] << ' ';
break;
}
next = (next + 1) % n;
}
}
cout << endl;
}
return 0;
}