摘要:关于报数问题c语言,c语言报告这个很多人还不知道,今天怡怡来为大家解答以上的问题,现在让我们一起来看看吧!
关于报数问题c语言,c语言报告这个很多人还不知道,今天怡怡来为大家解答以上的问题,现在让我们一起来看看吧!
1、方法一:()不受人数限制,因为采用的动态分配#include #include /以循环队列的数据结构实现时间复杂度T(n)采用循环队列数据结构,使得每次对数组的访问次数减少到少/int main(void){//定义并初始化各种变量int i=0,//控制变量num=0,//人数die=0,//报数值front,//队头位置rear,//队尾位置temp=0;//中间变量do{printf("n请输入人数(输入小于0退出):");scanf("%d",&num);printf("n请输入报数值:");scanf("%d",&die);int cycle=(int )malloc((num+1)sizeof(int));//多申请一个空间,在循环过程中方便处理//依次编号,一号元素为0,暂时闲置for(i=0;i{cycle[i]=i;}//置队头和队尾的位置front=1;rear=num;i=1;//报数器置1,开始报数while(front!=rear)//当队列中元素不止一个时,循环{//备份出队数据temp=(rear+1)%(num+1);//在位置rear后预留一个位置,以免有元素入队cycle[temp]=cycle[front];front=(front+1)%(num+1);//队头元素出队,队头位置加1//如果出队的人报数符合条件if(i==die){i=1;//报数重新置1,开始报数printf("%d出队n",cycle[temp]);//显示出队的元素}//如果出队的人报数不符合条件else{i++;//报数值增1//队尾插入刚出队的元素rear=(rear+1)%(num+1);cycle[rear]=cycle[temp];}}printf("幸存者是%dn",cycle[front]);free(cycle);}while(num!=0);return 0;}方法二:(按你的要求)#include /以纯粹的思维方法实现时间复杂度T(n)过程繁琐,而且也不容易理解/void main(void){int result(int p,int n,int m);int i=0,m=0,n=0;int num[50];int p;for(;;){printf("输入人数和报数值:");scanf("%d%d", &n, &m);for(i = 0; i num[i] = i + 1;p = num;cout}}int result(int p,int n,int m){int i=0;for(i=0;ip[i]=i+1;i=0; // i为每次循环时计数变量int k=0; // k为按1,2,3...m报数时的计数变量int die=0; // die为退出人数while (die{if (p[i]!=0) k++; //如果编号为0,就不报数;如果编号不为0,报数加1if (k==m) // 将退出的人的编号置为0{printf("%d退出n",p[i]);p[i]=0;k=0;//重新开始报数m++;//退出人数加1}i++;if (i==n) i=0; // 报数到尾后,i恢复为0}while(p==0) p++;return p;}。
本文到这结束,希望上面文章对大家有所帮助。