黑马程序员--c语言练习:亚瑟夫环

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

发一下之前用c语言做的亚瑟夫环,希望多多指教,共同学习

用标记的方式:

#include <stdio.h>

int count = 1;                        //用于循环:判定当前的人所报的数是否为3的倍数

int main()

{

int i, j = 15;                //i 用于数据循环  //j 记录人数

int a[15];

for(i = 0; i <j ; i++)          // 为每个人赋值  1   目的是判定出去的人  a[i] = 0

a[i] = 1;

// 循环方式为i  0~15  环形循环,结束条件j==1,即只剩一人

for(i = 0; j > 1 ;i ++)

{

if(i>14)                        // i大于数据界限,从零重新开始

i -= 15;

if(a[i])                        //  a[i]!=0 ,则a[i]继续参与判定

{

if(count % 3 == 0)        // 若报数为3的倍数

{

a[i] =0;        //使他下一轮不参与判定

j--;                //判定人数-1

}

count++;                        //报数+1

}

}

//只有叛徒的a[i]值任然为1,若在数组中的位置i,则他的真实位置是i+1

for(i = 0; i < 15; i++)

if(a[i])

printf("叛徒是%d\n",i+1);

return 0;

}

用链表链接形成环

#include <stdio.h>

#include<malloc.h>

#define LEN sizeof(struct Defect)        // 计算结构体大小

struct Defect                            // 定义叛徒结构体

{

int number;                          // 为每个人自己的号码牌

struct Defect *next;                 // 指针,下面用它链接形成环体

};

void def(int n,int m)                    // 传入人数n和报数为m时退出

{

int i = 2,count = 2;                 // i 记录人数,count记录报数

struct Defect *head,*p,*q;                // 设置三个结构体指针

q = head= (struct Defect *)malloc(LEN);   // 为第一个人申请结构体

head->number = 1;                         // 定义第一个结构体的号码为1

while(i<=n)                               // 用循环申请n个人的结构体,并为每个人的号码赋值

{

p = (struct Defect *)malloc(LEN);     // 申请

p->number = i++;                      //赋值

q->next = p;                          //链接

q = p;                                //定位

}

i = n;                                    //记录当前人数

p->next = head;                           //最后的人和第一个人链接

q = head;                                 //指定开始位置,由于设定为一个换   需要的话可以设定任意位置为开始位置

while(i>1)                                //人数大于1执行循环

{        p = q->next;                     //p指向下一个人

if(count%m == 0)                      //如果报数为m的倍数

{

q->next = p->next;                //删除当前的结构体

p->next = 0;

i--;                              //人数减一

}

else

q = p;                            //不满足条件,移动判定人

count++;                              //报数加1

if(count>3)                           //报数大于三时,换为1  其实可以没有这个判定,为了题目设计的123,123,123~~

count = 1;

}

printf("%d\n",q->number);                 //输出剩下的那个人

}

int main()

{

int n,m;                                  //设置人数,和报数退出条件

printf("请输入总人数:\n");

scanf("%d",&n);

if(n<2)

{

printf("游戏无意义!!");

return 0;

}

printf("请输入退出者的报数:\n 提示:若为1,则失去游戏的意义\n");

scanf("%d",&m);

if(n<2)

{

printf("游戏无意义!!");

return 0;

}

def(n,m);

return 0;

}

时间: 2024-08-10 15:08:50

黑马程序员--c语言练习:亚瑟夫环的相关文章

黑马程序员_C语言总结-基础部分

C语言基础 1.C语言的关键字 1>关键字就是C语言提供的有特殊含义的符号,也称为保留字,C语言中一共有32个关键字,这些关键字都有自己的含义 例如:int double float if  else switch for 等等 2.标示符的概念: 1>标示符就是在程序中自定义的一些名称,比如函数名,变量名,结构体名等等这些都是标示符 2>命名规则: 1>只能由英文字母的大小写和数字以及_下划线组成,且首字母必须为字母或者下划线_ 2>在C语言中是严格区分大小写的,比如if是

黑马程序员_OC语言前期准备

OC语言前期准备 一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应用程序. 拓展名:c语言-.c  OC语言.-m  兼容C++.-mm 注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具,抛开语法的差别外,我想最重要的应该是在解决问题的时候考虑的角度和方法不一样而已,然而这也构成了学习一门语言的重要性. 二.语法预览 (一)

黑马程序员-c语言变量作用域问题

c语言中的变量作用域总结 不管什么语言,main好像总是程序的入口,大括号是它的内容:变量的作用域总是困扰着我们,接下来,我们循序渐进的搞明白c语言中的变量作用域,首先得知道c是弱类型的语言,弱类型表现在很多方面: 1:你可以直接在程序中写一个常量,然后一个分号:1: 2:在定义函数时,void型的函数可以return:int型的可以不用写返回值. ---还有很多 下面我们一步一步开始:首先在main中定义的变量当然作用于整个main函数了 1:在main中定义变量 #include<stdio

黑马程序员——c语言学习心得—— 指针

黑马程序员——c语言学习心得—— 指针 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,打开文件fopen(文件名,打开方式);例如:FILE *fp = fopen("a1","r");  返回的是文件的指针(文件在内存缓冲区的首地址)fopen函数反回值 是指向 a1文件的指针,通常赋值给一个指针变量关于文件名a1 也可以是一个“路径+文件名”   c:\abc.txt----------------

黑马程序员——c语言学习心得——位运算符

黑马程序员——c语言学习心得——位运算符 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1. 按位与运算 按位与运算符"&"是双目运算符.其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1 ,否则为0.参与运算的数以补码方式出现. 例如:9&

黑马程序员——c语言学习心得—— 电影购票系统

黑马程序员——c语言学习心得——  电影购票系统 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,基础信息类 #import <Foundation/Foundation.h> #import "Cinema.h" void buyMovieTicket(){ //购买电影票 //调用 电影院的类的 buyTicket的方法 //                  [[Cinema alloc] init]; C

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

黑马程序员——c语言学习心得——位运算符a

黑马程序员——c语言学习心得——位运算符 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h>void func(int n, char  str[ ][5] ){int i;for(i = 0; i < n; i++)  printf("/nstr[%d] = %s/n"

黑马程序员-c语言基础:各种数据类型的输出占位符

c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d int a = 1; printf("这个整数是:%d", a); long: %ld; (long 是int得修饰,不能算是一种单独的数据类型,只是比int多了四个字节的存储空间) long long: %lld char : %c float/double : %f  float默认是6位小数输出:可以在%f中控制:例如:%.2f:输