zoukankan      html  css  js  c++  java
  • 终于完成了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;

  • 相关阅读:
    用纯 javascript 提高博客访问量
    大龄程序员交流
    Git 本地仓库操作基本命令
    SoapUI登录测试(2)-- 断言
    SoapUI测试登录
    deleteMany is not a function
    jQuery contextMenu使用
    安装MongoDB -- Windows平台
    TortoiseGit 图标不显示
    C#的自定义滚动条
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/4747236.html
Copyright © 2011-2022 走看看