W1约瑟夫问题

STEP1

确定表示方法。用数组的方法,如果index对应的值为0,则表示没有站出来,每次站出来的index对应的值变为1。

        初始化数组

         

STEP2

轮着出来。

        1.本想分两步,第一步有k的作用,第二步只有m,但是感觉其实k就是index就是一个初始位置。woc成功了,因为每次其实都是从一个特定位置开始所以不用单独考虑第一次。

        2.用int count = 0;while(count<n)确保循环的次数

        3.if(a[j]==0){}else{j++; if(j==n){j = 0;}}确保报1的这个数是之前没有被输出过的

        4.确保每次报m次的这个循环里的数都没有被输出过

        5.j其实才是下标 

        6.

        计数,每十个有回车,最后一个有回车,其他中间是空格。(一开始没看到十个一行)

#include <stdio.h>
#include <stdlib.h>
//怎样输出index 怎么删除 怎么轮
int main()
{   int n,k,m;
    scanf("%d,%d,%d",&n,&k,&m);
    if(k>n)
    {
        printf("k should not bigger than n.\n");
        exit(1);
    }
    if((n<1)||(m<1)||(k<1)){
        printf("n,m,k must bigger than 0.\n");
        exit(1);
    }
    int a[n];
    for(int i = 0;i<n;i++)
    {
        a[i] = 0;
    }
//
    int index = k-1;
    int j = index;
    int count = 0;
    int cnt1=0;
    while(count<n)
    {

        if(a[j]==0){

        //index = j+m;//这个过程很有可能造成略过已经出列的数字
        //到底怎么样才能在剩下的里面循环

            for(int k = 1;k<m;k++){
                j++;
                if(j==n){j = 0;}
                while(a[j]==1){
                    j++;
                    if(j==n){j = 0;}
                        }
                                }
        index = j+1;
        //if(index==(n+1)){index = 1;}
        printf("%d",index);
        cnt1++;
        if((cnt1%10==0)||(cnt1==n)){printf("\n");
        }
        else{printf(" ");}
        count++;
        a[index-1] = 1;

    }
        else{j++;
            if(j==n){j = 0;}}

    }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_62153438/article/details/126904019
今日推荐