约瑟夫环(求助C语言高手)
2015-08-10 22:31
501 查看
17个人编号从1到17围坐一圈,从编号1的人开始连续报数,数到7的罚下,下一个接着从一开始数,还是数到7的罚下。问最后省的是几号! 高手们~最好用数组解答
#include <stdio.h>#include <stdlib.h>main () {int a[17], b[17];int i, del = -1, sum;for (i = 0; i <= 16; i++) {a[i] = i + 1; //数组a记录编号b[i] = 1; //数组b标记是否出局}printf("Pass:");for (sum = 17; sum > 1; sum--) { //总人数递减,直到只剩一人for (i = 1; i <= 7;) { //在未出局的人中以7为轮次循环del = (del + 1) % 17; //后移下标,并控制在0~17之间if (b[del] == 1)i++;}printf(" %d", a[del]);b[del] = 0;}for (i = 0; b[i] == 0; i++); //找出未出局的编号printf("\nThe winner is: %d\n\n", a[i]);system("pause");}/** 或者只定义一个数组,用来记录编号,通过数组内部的移动来实现*/#include <stdio.h>#include <stdlib.h>main() {int sum, a[17], i, del = 0;for (i = 0; i <= 16; i++)a[i] = i + 1;printf("Pass:");for (sum = 17; sum != 1; sum--) {del = (del + 6) % sum; //将下标后移6位,并控制在0~17之间printf(" %d", a[del]);for (i = del; i <= sum - 2; i++)a[i] = a[i+1]; //后面的元素依次向前移一位,填补出局编号的位置}printf("\nThe winner is: %d\n\n", a[0]);system("pause");}
相关文章推荐
- C++实现双缓冲
- VS2015编译Libpng1618
- [leetcode-98]Validate Binary Search Tree(c++)
- c语言标准库中字符转换函数和数字转换函数
- 不用库函数,用C语言实现将一整型数字转化为字符串
- C++复制构造函数和赋值符的区别
- 翻译:怎样理解C++ 11中的trivial和standard-layout---An answer from stackoverflow
- c++模版形参(c++ Primer中文第四版)
- 翻译:怎样理解C++中的Aggregate和POD类型---An answer from stackoverflow
- c++中的三种排序,比较基础,因为作为一个编程员总要会几种排序方法
- C++_嵌套类
- c++学习笔记
- 线性表的顺序存储结构
- C语言 - 排序总结
- c++ 使用算法时确保目标区间足够大
- C++/CLI
- C语言 - 经典程序设计100例
- C语言-07-预处理、typedef、static和extern
- C++使用简单的函数指针
- 一起talk C栗子吧(第三十四回:C语言实例--巧用溢出计算最值)