有n个人围成一圈,顺序排号。从第一人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序的运行示例如下:
请输入人数:30
30个人中最后留下的是第29号。
输入提示:"请输入人数:"
输入格式:"%d"
输出提示: "%d个人中最后留下的是第%d号。"
指针:
#include #define nmax 500 //定义人数最大值 int main() { int i, k, m, n, num[nmax], * p; printf("请输入人数:"); scanf("%d", &n); p = num; //p指向数组元素首地址 for (i = 0; i < n; i++) { *(p + i) = i + 1; //给数组元素1-n顺序赋值 } i = 0; //指针回溯到第一个 k = 0; //k计数 初值0 m = 0; while (m < n - 1) { if (*(p + i) != 0) { k++; //如果计数不到3,k++ } if (k == 3) //报数到3 对应数组元素赋值为0 { *(p + i) = 0; k = 0; //计数器变为0 m++; //继续向后进行 } i++; //i++指针向后移动 if (i == n) { i = 0; //如果到达最后,把最后元素当成第一个继续找 } } while (*p == 0) { p++; } printf("%d个人中最后留下的是第%d号。", *p); //输出唯一不是0的人· }
数组:
# includeint main(void) { int k[500]; int a, b, c ,d,e,f; printf ("请输入人数:"); scanf("%d", &a); for (b = 1; b <= a; b++) { k[b] = b ; } c = 0; d = 1; e = 0; for (b = 1; d < a; b++) { if (k[b] == 0) { } if (k[b] != 0) { c++; } if (c == 3) { // printf("%d",-k[b]); k[b] = 0; c = 0; d++; } if (b == 30) { b = 0; printf("\n"); } } // printf("\n---------------------"); for (b = 1; b <= a; b++) { if (k[b] != 0) { printf("%d", -k[b]); } } return 0; }