C 练习实例69
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序分析:无。
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
void main()
{
int num[50],n,*p,j,loop,i,m,k;
printf("请输入这一圈人的数量:\n");
scanf("%d",&n);
p=num;
//开始给这些人编号
for (j=0;j<n;j++)
{
*(p+j)=j+1;
}
i=0;//i用于计数,即让指针后移
m=0;//m记录退出圈子的人数
k=0;//k报数1,2,3
while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人
//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
{
if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
{
k++;
}
if (k==3)
{ k=0; //报数清零,即下一个人从1开始报数
*(p+i)=0;//将报数为3的人编号重置为0
m++; //退出人数加1
}
i++; //指针后移
if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头
//并且它只能放在i++后面,因为只有i++了才有可能i==n
{
i=0;
}
}
printf("现在剩下的人是:");
for (loop=0;loop<n;loop++)
{
if (num[loop]!=0)
{
printf("%2d号\n",num[loop]);
}
}
}
以上程序执行输出结果为:
请输入这一圈人的数量: 8 现在剩下的人是: 7号
C 语言经典100例
Tad
266***2442@qq.com
参考方法:
#include<stdio.h> int main() { int a[50],n; printf("输入一圈人数:\n"); scanf("%d",&n); for(int i=0;i<n;i++){ a[i]=i+1; } int coun=0,k=0,l=0; while(coun<n-1){ if(a[l]!=0){ k++; } if(k==3){ a[l]=0; coun++; k=0; } l++; if(l==n){ l=0; } } printf("剩余的人是"); for(int i=0;i<n;i++){ if(a[i]!=0){ printf("%d号\n",a[i]); } } return 0; }Tad
266***2442@qq.com
ronnyz
221***8677@qq.com
参考方法:
#include <stdio.h> #define N 20 struct person{ int num; int *nextp; }link[N+1]; int main(){ int i,n,count,p; scanf("%d",&n); for(i=1;i<=n;i++){ link[i].num=i; if(i==n) link[i].nextp=1; else link[i].nextp=i+1; //printf("%3d",link[i].num); } //printf("\n"); count=0; p=n; while(count<n-1){ i=0; while(i!=3){ p=link[p].nextp; if(link[p].num) i++; } //printf("%3d",link[p].num); link[p].num=0; count++; } //printf("\n"); for(i=1;i<=n;i++){ //printf("%3d",link[i].num); if(link[i].num!=0) printf("%3d",link[i].num); } return 0; }ronnyz
221***8677@qq.com
huanhuan
992***291@qq.com
原理:假设全部人都退圈,则最后一个退圈的人就是题目中留下的那一位。
参考方法:
//vs 2010 pro 编写 #include<stdlib.h> #include<stdio.h> void main() { int a[100],n,i,k=0,count=0,lastone; printf("请输入人数:"); scanf("%d",&n);//n为人数 for(i=0;i<n;i++)//对于每个人a[i],他的编号实际上是i+1 a[i]=1;/* i表示人的状态,若a[i]=1,则表示i+1号在圈内, 若a[i]=0,则表示i+1号在圈外 */ while(k<n)/* 当所有人都退出圈子时停止循环 最后退圈的人就是题中有一个留在圈内的那个人 */ { for(i=0;i<n;i++)//对所有编号开始循环 if(a[i])//判断i+1号是否在圈内 { count++;//若在圈内,则报号 if(count%3==0)//判断号码是否为3的倍数 { a[i]=0;//若是3的倍数,则a[i]出圈 k++;//退圈人数+1 lastone=i+1;//记录此时退圈人的号码 } //lastone=i+1 修改这里的位置,放到判断语句内 } } printf("留下来的那个是%d号\n",lastone);//将最后退圈的人的号码输出 system("pause");//防止闪退 }huanhuan
992***291@qq.com
BakaCirno1001
341***2969@qq.com
参考:
//计数时跳过报过3的人 #include<stdio.h> //typedef enum {false,true}bool; #define N 8 //人数 int main() { int i,j,k,str[N] = {0}; for(k=0,i=0,j=N;j>0;i++) { if(i>=N) i%=N; //在圈中循环 if(0==str[i]) { if((++k % 3)==0) //没被淘汰的人 { str[i]=1; --j; //剩余人数 } } } printf("最后留下的是%d号.\n",i); getchar(); return 0; }BakaCirno1001
341***2969@qq.com
D
ads***gmail.com
参考:
#include <stdio.h> int main(){ int n,i,count=0,arr[255]; printf("Plz input n:"); scanf("%d",&n); for(i=1;i<=n;i++) arr[i]=1; i=0; while(1){ while(arr[i%n+1]==0) i++; //跳过圈外的 i++; //跳过第1个圈内的 while(arr[i%n+1]==0) i++; i++; //跳过第2个圈内的 while(arr[i%n+1]==0) i++; if (count++==(n-1)) break; //n-1个被淘汰测结束 arr[i%n+1]=0; //第3个圈内的退圈 } printf("%d\n",i%n+1); }D
ads***gmail.com
DawnEve
pos***469@163.com
使用动态内存保存数组,使用指针操作数组前移来删除元素。
#include<stdio.h> #include<stdlib.h> void printArr(int *arr, int n){ int i; for(i=0; i<n; i++){ printf("%d ", *(arr+i)); } printf("\n"); } // 删除第j个元素,就是第j个元素被后一个元素覆盖 void delArr(int *arr, int n, int j){ int i; for(i=j; i<n; i++){ *(arr+i)=*(arr+i+1); } } int main(){ int counter=0, n, remain; printf("input the number of total people:"); scanf("%d", &n); //输入总人数 n if(0==n) return 1; if(n<1){ printf("Error: must >1\n"); return 1; } remain=n; //分配一块内存 int i, *arr0, *arr=malloc( sizeof(int)*n); arr0=arr; //初始化 for(i=0; i<n; i++){ *(arr+i)=(i+1); } int j; while(remain>1){ printf("==> remain=%d (first element counter=%d)\n", remain, counter+1); printArr(arr, remain); //剩余元素 //报数,遇到3的倍数,则 for(j=0; j<remain; j++){ counter++; counter=counter%3; if(counter==0){ printf("删除元素: %d\n", arr[j]); delArr(arr, remain, j); //删除数组arr的第j个元素,后面的前移 j--; remain--; } } } printf("剩下的元素是: %d\n", arr[0]); return 0; }DawnEve
pos***469@163.com