约瑟夫问题

排版题.输出排列成菱形的字母

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值