标题:约瑟夫循环问题
只看楼主
hyq加油加油
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
结帖率:0
已结贴  问题点数:20 回复次数:6 
约瑟夫循环问题
假设41个人围成一圈,其中有m个你的朋友不想死掉,从第一个开始报数,第3个将被杀掉。为了保护自己和m个朋友,现在编写程序,求出如何安排自己和m个朋友的初始位置。
搜索更多相关主题的帖子: 编写程序 约瑟夫 朋友 如何 
2015-10-26 21:52
蓝色风暴cl
Rank: 8Rank: 8
来 自:新疆
等 级:蝙蝠侠
威 望:3
帖 子:163
专家分:704
注 册:2015-9-6
得分:10 
书上有十三个人的相似问题。

欢迎大家加好友哦,多找我聊聊吧!
2015-10-26 22:31
hyq加油加油
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
得分:0 
回复 2楼 蓝色风暴cl
没有啊,什么书上有啊???谢谢!!!
2015-11-02 22:12
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:10 
论坛里有很多这样的帖子我以前就发过

一片落叶掉进了回忆的流年。
2015-11-02 22:21
igeek
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-11-2
得分:0 
2015-11-03 10:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
假设41中留5个
程序代码:
#include <stdio.h>

#define N 41
#define M 5

int main( void )
{
    int list[N];
    for( int i=0; i!=N; ++i )
        list[i] = (i+1)%N;

    for( int i=0, j=0; j!=(N-M); i=list[list[i]], ++j )
    {
        int the3rd = list[ list[i] ];
        list[ list[i] ] = list[the3rd];
        list[the3rd] = -1;
    }

    for( int i=0; i!=N; ++i )
    {
        if( list[i] == -1 )
            printf( " _" );
        else
            printf( " %d", i );
    }

    return 0;
}
输出为
_ _ _ 3 _ _ _ _ _ _ _ _ _ _ _ 15 _ _ _ _ _ 21 _ _ _ _ _ _ _ _ 30 _ _ _ 34 _ _ _ _ _ _



2015-11-03 10:45
hyq加油加油
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
得分:0 
有问题,明显不对。
#include<stdio.h>
#define size 100
void main()
{
    int person[size];
    int i, j,m;
    int arrayLen;
    int start=1, overNum;
    int deleNum;
    int total;
    printf( "请输入圆桌上人的总数: " );
    scanf( "%d", &arrayLen );
    printf( "\n" );
    if( ( arrayLen > size ) || ( arrayLen < 0 ) )
    {
        printf( "超出范围,请重新输入: " );
        scanf( "%d", &arrayLen );
        printf( "\n" );
    }
    for( i = 0; i < arrayLen; i++ )
    {
        person[i] = i+1;
    }
    printf( "你输入的数据的顺序为: \n" );
    for( i = 0; i < arrayLen - 1; i++ )
        printf( " %d ==>", person[i] );
    printf( "%d \n", person[arrayLen - 1] );
    printf( "\n" );
    start = start - 1;
    printf( "请输入相邻两出列人之间的间隔: " );
    scanf( "%d", &overNum );
    printf("想让几个人活下来:");
    scanf("%d",&m);
    printf( "\n" );
    total = arrayLen-1;
    printf( "程序运行后,出列人的顺序为:\n\n" );
    for( i = 0; i < total-m; i++ )
    {
        if ( arrayLen == m )
            printf( "%d", person[0] );
        else
        {
            deleNum = ( start + overNum) % arrayLen; /* 保证循环 */
            printf( "%5d", person[deleNum] );
            for ( j = deleNum; j < arrayLen; j++ ) /* 将出列元素后面的各元素前移 */
                person[j] = person[j+1];
            start = deleNum;
            arrayLen = arrayLen - 1; /* 移动完毕后,数组长度减1 */
        }
    }
    printf("\n存活下来的人的序号:");
    for(i=0;i<m;i++)
        printf("%5d",person[i]);
    printf( "\n\n" );
}
2015-11-09 21:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-458590-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024869 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved