![]() |
#2
rjsp2022-03-03 17:03
|
找到了两种解答方式,第一种比较容易理解,第二种有没有大佬解答一下,非常感谢!!!
第一种:

#include<stdio.h>
main() {
int a[17] = { 0 };//代表17个人,值为0代表还在,1代表离开
int baoshu = 1;//当前报数的数字,最多49
int total = 17;//当前还剩多少人在
int cur = 0;//17个人的当前人循环到的编号
int i;
while (total!=1) {
if (cur == 17) //说明已经走到下一圈了,需要保证当前人的编号
cur = 0;
if (a[cur] == 1) { //说明该人已经离开圈子,报数不增加,走向下一人判断
cur++;
continue;
}
if (baoshu % 3 == 0) {
a[cur] = 1;
total -= 1;
}
baoshu++;
cur++;
}
for (i = 0; i < 17; i++)
if(a[i]==0)
printf("%d",i);
}
main() {
int a[17] = { 0 };//代表17个人,值为0代表还在,1代表离开
int baoshu = 1;//当前报数的数字,最多49
int total = 17;//当前还剩多少人在
int cur = 0;//17个人的当前人循环到的编号
int i;
while (total!=1) {
if (cur == 17) //说明已经走到下一圈了,需要保证当前人的编号
cur = 0;
if (a[cur] == 1) { //说明该人已经离开圈子,报数不增加,走向下一人判断
cur++;
continue;
}
if (baoshu % 3 == 0) {
a[cur] = 1;
total -= 1;
}
baoshu++;
cur++;
}
for (i = 0; i < 17; i++)
if(a[i]==0)
printf("%d",i);
}
第二种:

#include<stdio.h>
main() {
int i,test,p[17],head;
for(i=0; i<16; i++)
p[i]=i+1;
p[16]=0;
test=0;
while(test!=p[test]) {
for(i=1; i<3; i++) {
head=test;
test=p[test];
}
p[head]=p[test];
test=p[head];
}
printf("%d",test);
}
main() {
int i,test,p[17],head;
for(i=0; i<16; i++)
p[i]=i+1;
p[16]=0;
test=0;
while(test!=p[test]) {
for(i=1; i<3; i++) {
head=test;
test=p[test];
}
p[head]=p[test];
test=p[head];
}
printf("%d",test);
}