• 终于完成了Josephus的C语言实现啦~~


    /*以下程序用来解决Josephus问题,现在只是完成了M>N的情况,2015-08-20 22:22:20*/
    /*发现一个问题:数组的赋值问题:char People[N]={1};并不代表所有的元素都是1啊,要确保全都是1,务必使用char People[N]={1,1,1,1};或者采用循环给数组赋值*/

    #include <stdio.h>
    #include <math.h>
    #define N 10 //
    #define M 3 //
    main(void)
    {
    char p,People[N];//1 means alive 0 means died
    for(p=0;p<N;p++)
    {
    People[p]=1;
    }
    int Last=N,j=0,k=0,Temp=0;
    if(M>N)
    {
    while(Last!=0)
    {
    j=(M%Last)-1;//需要从当前的值移动的总次数(要排除掉已经为0的元素)
    if(j>0)
    {
    for(k=1;k<=j;)
    {
    Temp++; //当前的值自加得到下一次的数组元素值
    if(Temp>N-1) {Temp=0;}
    if(People[Temp]!=0) {k++;} //如果下一个元素的值为0 ,那么k就不会变化
    } 
    }
    else 
    {
    for(k=1;k<=abs(j);)
    {
    Temp--; //当前的值自减得到下一次的数组元素值
    if(Temp<0) {Temp=N-1;}
    if(People[Temp]!=0) {k++;} //如果下一个元素的值为0 ,那么k就不会变化
    } 
    }
    printf("People rank %d is died
    ",Temp+1);
    k=Temp+1;
    for(k;People[k]==0;k++)//要确定下一个其实元素的值,下一个元素的值不能是0,而是第一个1
    {
    if(k>N-1) {k=0;} //倘若k大于N-1时,就需要将k赋值为0避免溢出
    }
    Temp=k;
    Last--;
    }
    }
    else 
    {
    while(Last!=0)//N4 M2
    {
    for(k=1;k<=M-1;)
    {
    Temp++; //当前的值自加得到下一次的数组元素值
    if(Temp>N-1) {Temp=0;}
    if(People[Temp]!=0) {k++;} //如果下一个元素的值为0 ,那么k就不会变化
    } 
    People[Temp]=0;
    printf("People rank %d is died
    ",Temp+1);
    k=Temp+1; if(k>=N) {k-=N;}
    for(k;People[k]==0;k++)
    {
    if(k>N-1) {k=0;}
    }
    Temp=k;
    k=1;
    Last--;
    }
    }
    return 0;
    }

    注:若要改变起始位置,比如从第K个人开始,则Temp=K-1;

  • 相关阅读:
    利用原生JS判断组合键
    MySQL基本操作简述
    Java链接Mysql传输数据
    Java培训--->>基础
    Java基础之字符串-->>字符串处理
    Java基础之结构-->>条件结构与循环结构
    Java基础之数组-->>数组常用操作
    Front End Development Certification (HTML5 and CSS)
    FlexSlider插件的详细设置参数
    常见<meta>的基本用法详解
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/4747236.html
Copyright © 2020-2023  润新知