排版题.输出排列成菱形的字母
Time Limit:1s Memory Limit:1000k
Total Submit:9004 Accepted:2842
Problem
将编号为1,2,...,N的N个人按顺时针方向围坐一圈,每人持有一个密码(10000以内的正整数)。一开始任选一个正整数作为报数上限值M,从第一个开始按顺时针方向自1开始报数,报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
Input
本题有多组数据。每组数据的第一行是两个整数N,M(0<N,M<100),第二行是N个正整数,分别表示1到N个人持有的密码。
两组数据之间空开一行。
Output
对每组数据,按离开的顺序输出他们的编号。数字之间用一个空格分开。每组数据独占一行输出。
Sample Input
7 20
3 1 7 2 4 8 4
4 3
1 2 3 4
Sample Output
6 1 4 7 2 3 5
3 2 1 4
C的求解及答案
#include <stdio.h>
#include <memory.h>
int main()
{
int array[101];
int N, M, i, pos, first;
while(scanf("%d%d", &N, &M) > 0){
for(i = 0; i < N; i++){
scanf("%d", &array[i]);
array[i] |= ((i+1) << 16);
}
pos = 0; first = 1;
while(N > 0){
pos = (pos + M - 1) % N;
if(first){
printf("%d", array[pos] >> 16);
first = 0;
}else printf(" %d", array[pos] >> 16);
M = (short)array[pos];
memcpy(array+pos, array+pos+1, sizeof(int)*(N-pos));
N--;
}
putchar('/n');
}
return 0;
}
Memory: 36K
Time: 1ms