• 第四章习题


    例题4-3

     1 #include<stdio.h>
     2 
     3 #define maxn 25
     4 int n, k, m, a[maxn];
     5 
     6 int go(int p,int d,int t)
     7 {
     8     while(t--)
     9     {
    10         do
    11         {
    12             
    13             p = (p+d-1+n) % n+1 ;
    14 
    15         }while(a[p]==0);
    16     }
    17 
    18     printf("(%d %d)
    ",p,d);
    19 
    20     return p;
    21 }
    22 
    23 int main()
    24 {
    25     while(scanf("%d%d%d", &n, &k, &m) == 3 && n) 
    26     {
    27         for(int i = 1; i <= n; i++) 
    28             a[i] = i;
    29         int left = n; //还剩下的人数
    30         int p1 = n, p2 = 1;
    31         while(left) 
    32         {
    33             p1 = go(p1, 1, k);
    34             p2 = go(p2, -1, m);
    35             printf("%3d", p1); 
    36             left--;
    37             if(p2 != p1) 
    38             {
    39                  printf("%3d", p2); left--;
    40             }
    41             a[p1] = a[p2] = 0;
    42             if(left) 
    43                 printf(",");
    44         }
    45         printf("
    ");
    46         }
    47         return 0;
    48 }

    这里最要注意的是13行的移动一位的操作,p = (p+d-1+n) % n+1 是为了在1-n 之间循环 如果是在0 -n 之间循环应该写为 p=(p+d+n)%n

    例题 4-4

      1 #include<cstdio>
      2 #include<cstring>
      3 
      4 int codes[8][1<<8];
      5 
      6 int readchar()
      7 {
      8     
      9     int ch=getchar();
     10 
     11     for(;;)
     12     {        
     13         if(ch!='
    ')
     14             return ch;
     15 
     16         ch=getchar();
     17     }
     18 }
     19 
     20 
     21 int readint(int n)
     22 {
     23     int value=0;
     24 
     25     while(n--)
     26     {
     27         value=value*2+readchar()-'0';
     28     }
     29 
     30     return value;
     31 }
     32 
     33 
     34 int readcodes()
     35 {
     36     memset(codes,0,sizeof(codes));
     37 
     38     codes[1][0]=readchar();
     39 
     40 /*
     41 
     42     上面的用readchar()的原因是当循环解码一次后最后一个字符会是'
    '
     43     如果不跳过回车,会直接进入下一次循环,导致没有编码头就开始读取编码文本
     44     再次输入时$%**会算出len为负数,readint()会进入死循环
     45     
     46 */
     47 
     48     for(int len=2;len<=7;len++)
     49         for(int value=0;value<(1<<len)-1;value++)
     50         {
     51             int ch=getchar();
     52 
     53             if(ch==EOF)
     54                 return 0;
     55             if(ch=='
    ')
     56                 return 1;
     57 
     58             codes[len][value]=ch;
     59         }
     60 }            
     61 
     62 void printcodes()
     63 {
     64     for(int len=1;len<=7;len++)
     65         for(int value=0;value<(1<<len)-1;value++)
     66         {
     67             int ch=codes[len][value];
     68 
     69             if(ch!=0)
     70                 printf("codes[%d][%d]=%c
    ",len,value,codes[len][value]);
     71             else
     72                 break;
     73         }
     74 }
     75 
     76 int main()
     77 {
     78     while(readcodes())
     79     {
     80         
     81         printcodes();
     82 
     83 
     84          //我的实现一
     85 
     86         for(;;)
     87         {
     88             int len=readint(3);
     89             printf("len=%d
    ", len);
     90 
     91             if(len==0)
     92                 break;
     93 
     94         for(;;)
     95         {
     96             int value=readint(len);
     97             printf("value=%d
    ", value);
     98             
     99             if(value<(1<<len)-1)
    100                 printf("%c",codes[len][value]);
    101             else
    102                 break;
    103         }
    104 
    105         }
    106     
    107 
    108 
    109 
    110 /*    
    111         //书上的实现
    112 
    113         for(;;) 
    114         {
    115             int len = readint(3);
    116             if(len == 0) break;
    117             //printf("len=%d
    ", len);
    118             for(;;) 
    119             {
    120                 int v = readint(len);
    121                 //printf("v=%d
    ", v);
    122                 if(v == (1 << len)-1) break;
    123                 putchar(codes[len][v]);
    124             }
    125         }
    126         printf("
    ");
    127 */
    128 
    129 /*
    130         //我的实现二
    131 
    132          int len=readint(3);
    133         printf("len=%d
    ", len);
    134 
    135 
    136         if(len!=0)
    137             for(;;)
    138             {
    139                 int value=readint(len);
    140                 printf("value=%d
    ", value);
    141                 
    142                 if(value<(1<<len)-1)
    143                     printf("%c",codes[len][value]);
    144                 else
    145                 {
    146                     len=readint(3);
    147 
    148                     if(len==0)
    149                     {
    150                         printf("len=%d
    ", len);
    151                         break;
    152                     }
    153                     printf("len=%d
    ", len);
    154                 }
    155             }    
    156 */            
    157 
    158     }
    159 
    160     return 0;
    161 }
    Yosoro
  • 相关阅读:
    LeetCode算法第一题
    基础题整理
    MongoDB 之 Limit 选取 Skip 跳过 Sort 排序 MongoDB
    MongoDB 之 $关键字 及 $修改器 $set $inc $push $pull $pop MongoDB
    mongodb的数据类型
    mongodb的增删改查
    session与cookie之间的关系
    Python 格式化输出的3种方式
    判断python字典中key是否存在的两种方法
    python实现忽略大小写对字符串列表排序的方法
  • 原文地址:https://www.cnblogs.com/tclan126/p/7189861.html
Copyright © 2020-2023  润新知