• C语言算法碎碎记录之“一圈人,数到几的人就出去,最后一个是几号”


    一队列有N个人,从第一位开始报数,报到3的人出列,后面的人继续从1开始报数,报到末尾后从头开始,如此反复。请确定最后一位是原队列中的第几个人。N的值为正整数。
    看到这道题目,以前做过。现在来复习一下吧:
    首先用结构体 和 循环单链表来做,最简单:
    View Code
     1 #include <stdio.h>
    2 int N= 10;
    3
    4 struct PEOPLE{
    5 int Number;
    6 struct PEOPLE *next;
    7 }*cur,*tmp;
    8
    9 int main(int argc,char **argv){
    10 if(argc==2){
    11 N=atoi(argv[1]);
    12 }
    13 struct PEOPLE head[N];
    14 int out=3;
    15 int ALL=N;//People
    16 cur=head;//=malloc(sizeof(PEOPLE)*N);
    17
    18 int i=0;
    19 printf("init\n");
    20 for(;i<N;i++){
    21 cur[i].Number=i+1;
    22 cur[i].next=&cur[i+1];
    23 printf("%d ",cur[i].Number);
    24 }printf("\n");
    25 cur[i-1].next=&cur[0];
    26 i=0;tmp=cur=head;int count=0;
    27 printf("Begin to play this game...\n");
    28 while(1){
    29 i++;
    30 printf("I am %d ,my turn is :%d ",cur->Number,i);
    31 if(i%3==0){
    32 printf(",OK, i am 3,I will out");
    33 i=0;
    34 tmp->next=cur->next;
    35 cur=cur->next;//tmp=cur;
    36 // count++;if(count==ALL-1)break;
    37 if(cur->next==cur)break;
    38 }else{
    39 tmp=cur;
    40 cur=cur->next;
    41 }
    42 printf("\n");
    43
    44 }
    45 printf("\n\nThe last one's Number is:%d\n",cur->Number);
    46 }

    其实我一直想用数组做的,觉得可以,构思了很久才想出来怎么做(好多循环啊,会把你饶迷的):
    View Code
     1 int main(){
    2 int ALL=10;
    3 int out=3;
    4 #define is_here 1
    5 #define is_out 0
    6 int head[ALL][3];
    7 int i=0,j=0;
    8 for(;i<ALL;i++){
    9 head[i][0]=i+1;
    10 head[i][1]=is_here;
    11 head[i][2]=++j;
    12 if(j==3)j=0;
    13 }
    14 int isover=1;int isLastFlag=0;
    15 i=0;int is_here_num=ALL;int count=0;int last;
    16
    17 while(isover){
    18 for(i=0;i<ALL;i++){
    19 if(head[i][1]==is_here) printf("%d %s %d \n",head[i][0],head[i][1]==is_here?"is_here":"is_out",head[i][2]);
    20 if(head[i][2]==out && head[i][1]==is_here){
    21 head[i][1]=is_out;
    22 printf("I am %d, and i am out\n",head[i][0]);
    23 count++;
    24 if(count==ALL-1){//只剩下一个的时候
    25 isover=0;i=ALL;break;
    26 // j=0;isLastFlag=0;
    27 }
    28 }
    29 }
    30
    31
    32 isLastFlag=0;//j=0;
    33 for(i=0;i<ALL;i++){//reset 1 2 3;
    34 if(head[i][1]==is_here){
    35 head[i][2]=++j;
    36 if(j==out){
    37 j=0;
    38 isLastFlag=1;
    39 }
    40 }
    41 }
    42 if(isLastFlag==0){//if 剩余的小于 这个 out数字.继续循环直到j=out的时候
    43 isLastFlag=2;
    44 last=1;
    45 while(last){
    46 for(i=0;i<ALL;i++){
    47 if(head[i][1]==is_here){
    48 head[i][2]=++j;
    49 }
    50 if(j==out){
    51 i=ALL;last=0;
    52 }
    53 }
    54 }
    55 }
    56
    57 }
    58 for(i=0;i<ALL;i++){
    59 if(head[i][1]==is_here)
    60 printf("The Last One is :%d\n",head[i][0]);
    61 }
    62
    63 }
    把赋值初始化 单独拿出来:
    View Code
     1     int ALL=10;
    2 int out=3;
    3 int head[10][3];
    4 //int head[ALL][3];//this is error? variable modified 'head' at file scope
    5 #define is_here 1
    6 #define is_out 0
    7 int i=0,j=0;
    8
    9 int isover=1;
    10 int isLastFlag=0;//标志
    11 int count=0;
    12 int last;
    13
    14 void initarray(int level){
    15 for(i=0;i<ALL;i++){
    16 if(level==0){
    17 head[i][0]=i+1;
    18 head[i][1]=is_here;
    19 head[i][2]=++j;
    20 if(j==out){
    21 j=0;
    22 isLastFlag=1;
    23 }
    24 }else{
    25 if(head[i][1]==is_here){
    26 head[i][2]=++j;
    27 if(level==2){
    28 i=ALL;last=0;
    29 }else{
    30 if(j==out){
    31 j=0;
    32 isLastFlag=1;
    33 }
    34 }
    35 }
    36 }
    37 }
    38 }
    39
    40 int main(){
    41 int is_here_num=ALL;
    42 initarray(0);
    43 while(isover){
    44 for(i=0;i<ALL;i++){
    45 if(head[i][1]==is_here) printf("%d %s %d \n",head[i][0],head[i][1]==is_here?"is_here":"is_out",head[i][2]);
    46 if(head[i][2]==out && head[i][1]==is_here){
    47 head[i][1]=is_out;
    48 printf("I am %d, and i am out\n",head[i][0]);
    49 count++;
    50 if(count==ALL-1){//只剩下一个的时候
    51 isover=0;i=ALL;break;
    52 }
    53 }
    54 }
    55
    56 isLastFlag=0;
    57 initarray(1);
    58
    59 if(isLastFlag==0){//if 剩余的小于 这个 out数字.继续循环直到j=out的时候
    60 isLastFlag=2;
    61 last=1;
    62 while(last){
    63 initarray(2);
    64 }
    65 }
    66
    67 }
    68 for(i=0;i<ALL;i++){
    69 if(head[i][1]==is_here)
    70 printf("The Last One is :%d\n",head[i][0]);
    71 }
    72
    73 }
    这个遇到的问题就是 如果是函数传递 二维数组的参数,有错误,比如int initarray(int **array,int level);传入参数写成了initarray(&&head,0);有错误。。其实这个head动态分配malloc,直接用**来做 或许还好点吧。。
     

    转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

    ------------------------------------------------------------------------------------------------

    一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。

  • 相关阅读:
    Web前端之jQuery 的10大操作技巧
    Python开发者须知 —— Bottle框架常见的几个坑
    string、const char*、 char* 、char[]相互转换
    SLAM中的变换(旋转与位移)表示方法
    SLAM
    二叉搜索树(BST)
    Linux下OSG的编译和安装以及遇到的问题
    CMake--Set用法
    CMake--List用法
    php面向对象面试题
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2386576.html
Copyright © 2020-2023  润新知