终于完成了Josephus的C语言实现啦~~
2015-08-21 11:00
513 查看
/*以下程序用来解决Josephus问题,现在只是完成了M>N的情况,2015-08-20 22:22:20*/
/*发现一个问题:数组的赋值问题:char People
={1};并不代表所有的元素都是1啊,要确保全都是1,务必使用char People
={1,1,1,1};或者采用循环给数组赋值*/
#include <stdio.h>
#include <math.h>
#define N 10 //
#define M 3 //
main(void)
{
char p,People
;//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\n",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\n",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;
/*发现一个问题:数组的赋值问题:char People
={1};并不代表所有的元素都是1啊,要确保全都是1,务必使用char People
={1,1,1,1};或者采用循环给数组赋值*/
#include <stdio.h>
#include <math.h>
#define N 10 //
#define M 3 //
main(void)
{
char p,People
;//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\n",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\n",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;
相关文章推荐
- IIR 滤波器的实现(C++)
- C++ STL std::pair
- C语言实现绘制柱状图
- C语言 malloc、calloc、realloc的区别
- [C++]Rotate Array 旋转数组
- 前置和后置操作符的区别(More Effective_C++_6(运算符))
- 如何让对象只在堆或者栈中分配空间ANDC++禁止一个类被继承
- C++ Primer : 第十二章 : 动态内存之shared_ptr类实例:StrBlob类
- C++ map的基本操作和使用
- [iOS]C语言技术视频-17-指针变量高级用法练习二(使用堆内存完成链表结构的存储)
- [iOS]C语言技术视频-16-指针变量高级用法(堆栈内存)
- [iOS]C语言技术视频-15-指针变量高级用法练习一(函数指针完成动态排序)
- c++中无名命名空间的使用
- 井字棋
- [iOS]C语言技术视频-14-指针变量高级用法(函数指针)
- [iOS]C语言技术视频-13-指针变量练习三(结构体指针变量)
- [iOS]C语言技术视频-12-指针变量练习二(数组打印)
- C语言中的const、extern及结构体、联合体的定义
- [iOS]C语言技术视频-11-指针变量练习一(交换值)
- [iOS]C语言技术视频-10-指针变量