您的位置:首页 > 编程语言 > C语言/C++

约瑟夫环(求助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");}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: