C语言每日一题—约瑟夫问题

复制代码
13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。

***输出提示:"\n出圈成员及顺序:"
***输出格式:"%3d"
***输出提示:"\n最后的成员是:"
***输出格式:"%3d"

1、不用结构体

cpp 复制代码
#include<stdio.h>

int main()
{
    int a[13]={0};
    int i,j=0,n;
    printf("\n出圈成员及顺序:");
    for(i=1;i<=12;i++)
    {
        n=1;
        do
        {
            if(j>12) j=0;
            if(a[j]!=0) j++;
            else
            {
                if(n==3)
                {
                    a[j]=i;
                    printf("%3d",j+1);
                }
                j++;
                n++;
            }
        }while(n<=3);
    }
    printf("\n最后的成员是:");
    for(i=0;i<=12;i++)
    {
        if(a[i]==0)
            printf("%3d",i+1);
    }
    return 0;
}

2、用结构体(参考答案)

cpp 复制代码
#include <stdio.h>

#define	N 13

struct person
{  	 	  		 		 
    int number;
    int nextp;
}link[N + 1];

int main(void)
{  	 	  		 		 
    int i, count, h;

    /* 建立队列 */
    for (i = 1; i <= N; i++)
    {  	 	  		 		 
        if (i == N)
        {  	 	  		 		 
            link[i].nextp = 1;
        }
        else
        {  	 	  		 		 
            link[i].nextp = i + 1;
        }
        link[i].number = i;
    }
    
    count = 0;
    h = N;
    printf("\n出圈成员及顺序:");
    while (count < N - 1)
    {  	 	  		 		 
        i = 0;
        while (i != 3)
        {  	 	  		 		 
            h = link[h].nextp;
            if (link[h].number)
            {  	 	  		 		 
                i++;
            }
        }
        printf("%3d", link[h].number);
        link[h].number = 0;
        count++;
    }

    printf("\n最后的成员是:");
    for (i = 1; i <= N; i++)
    {  	 	  		 		 
        if (link[i].number)
        {  	 	  		 		 
            printf("%3d", link[i].number);
        }
    }

    return 0;
}
相关推荐
wuyk5556 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
NEFU_Jyj7 小时前
牛客周赛R168
算法
Navigator_Z14 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
D e re k ZH15 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶16 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
雪落漂泊16 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
LabVIEW开发18 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
严肃小白兔19 小时前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
Hhy_110720 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio