入门经典紫书(刘汝佳)第四章例题汇总

HangmanJudgeUVa489

自写:

#include<stdio.h>
#include<string.h>

int main(){
     int n, fault , trueNum , length,k;
     bool x;
     char a[100];
     char b[100];
     end:while(scanf("%d",&n)!=EOF&&n!=-1){
          scanf("%s%s",a,b);
          int length = strlen(a);
          fault = 0;
          trueNum = 0;
          x = false;
          for(int i = 0 ; i < strlen(b) ; i++){
             x=false;
             for(int j = 0 ; j<length ; j++){
                   if(b[i]==a[j])
                   {
                         trueNum++;
                         a[j] = ' ';
                      //   printf("此时正确的字符数字为%d,字符长度为%d,第a[%d]的字符变为空格\n",trueNum,length,j);
                         x=true;
                         if(fault>=7) {
                            printf("Round %d\nYou lose.\n",n);
                            goto end;
                         }
                         if(trueNum==length){
                             printf("Round %d\nYou win.\n",n);
                             goto end;
                         }
                   }
            }
            if(x==false) fault++;
            if(fault>=7) {
                printf("Round %d\nYou lose.\n",n);
                goto end;
            }
            if(trueNum>=length){
                printf("Round %d\nYou win.\n",n);
                goto end;
            }
        }
        printf("Round %d\nYou chickened out.\n",n);
     }
     return 0;
}

/*
     1. int n 第n个测试 ,char a[]存放正确的字符串,char b[] 存放猜测的字符串,
         int fault 存放猜测错误的次数,int trueNum 存放猜对了几个字符,
         int length a字符串的长度,bool x ;

     2.输入n,输入a[],输入b[],int length = strlen(a),fault = 0 ,trueNum = 0,x=false;

     3.for(int i = 0 ; i < strlen(b) ; i++){
             x=false;
             for(int j = 0 ; j<length ; j++){
                   if(b[i]==a[j])
                   {
                         trueNum++;
                         a[j] = ' ';
                         f(fault,trueNum,length,n);
                         x=true;
                   }
            }
            if(x==false) fault++;
            f(fault,trueNum,length,n);
        }
        printf("Round %d\nYou chickened out.\n",n);


     4.写一个判断函数//过于麻烦且不好回到开始的状态,所以去掉函数
     void f(int fault , int true,int length,int n){
             if(fault>=7) {
                   printf("Round %d\nYou lose.\n",n);
                   exit(0);
               }
               if(true==length){
                   printf("Round %d\nYou chickened out.\n",n);
                   exit(0);
               }
     }
*/

例题代码:

#include<stdio.h>
#include<string.h>
#define maxn 100
int left,chance;
char s[maxn],s2[maxn];
int win,lose;

void guess(char ch){
     int bad = 1;
     for(int i = 0 ; i<strlen(s) ; i++)
         if(s[i] == ch) { left-- ; s[i] = ' '; bad = 0; }
     if(bad) --chance;
     if(!chance) lose = 1;
     if(!left) win = 1;
}

int main(){
     int rnd;
     while(scanf("%d%s%s",&rnd,s,s2) == 3 && rnd != -1){
          printf("Round %d\n",rnd);
          win = lose = 0;
          left = strlen(s);
          chance = 7;
          for(int i = 0 ; i<strlen(s2) ; i++){
               guess(s2[i]);
               if(win || lose) break;
          }
          if(win)  printf("You win.\n");
          else if(lose) printf("You lose.\n");
          else printf("You chickened out.\n");
     }
     return 0;
}


MessageDecodingUVa213

自写:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define Maxn 100000
char ch[Maxn];
int Sequence[100000];
int Binary[8][10000];
int k = 0;

int readint(int n){
     int sum = 0;
     int k;
     char cha;
          while(n&&(cha = getchar())!=EOF){
             if(cha!='\r'&&cha!='\n'){
                n--;
                k = cha-'0';
                sum = sum+k*(int)pow(2,n);
             }
          }
          return sum;
}

int main()
{
      F:if(k>0) getchar();
      while(gets(ch)){
      int len=0 , XiaBiao=0 , X=0;
      int Figure = 0, num = 0;
      memset(Sequence,-1,sizeof(Sequence));
      memset(Binary, -1 ,sizeof(Binary));
      re: len = readint(3);
      if(len == 0) {
            for(int i = 0 ; Sequence[i]!=-1;i++){
                 printf("%c",ch[Sequence[i]]);
            }
            printf("\n");
            k = 1;
            goto F;
      }
      for(int i = 0; ;){
           X = readint(len);
           if(X!=pow(2,len)-1){
                Binary[len][i] = X;
                XiaBiao = pow(2,len) -1 - len + Binary[len][i];        //等比公式
                Sequence[num] = XiaBiao;
                num++;
                i++;
           }
           if(X==pow(2,len)-1){
               goto re;
           }
      }
    }
}



/*
     1.设置 int len, XiaBiao,  分别表示二进制长度,最后的输出下标

     2.读取一行字符串 char ch[100000];  读取二进制数int Binary[8][100000]; 行表示二进制数长度,数组内存储对应的
        十进制数。并在存储时,将计算好的下标存储在Sequence中。(核心)
        问题:1.如何读取一行字符串?
        解决方法:gets,fgets 在使用中仍有读取多余空格字符的情况,需要注意。

     关于字符串:
                            问题:1.如何将字符与相应的编码对应,因为不同长度的二进制可能会代表
                                       相同的十进制数字
                            解决办法:利用等比求和公式,求出对应下标XiaBiao。

     关于二进制数的存储:
                             问题:1.如何将二进制数输入的长度与其字段还有末尾的结束字段分开存储
                             解决办法:1.首先的三个字符为接下来的编码分段长度,且将首先的三个字符转换为十进制并存储(len)
                                              2.按len将二进制转换为十进制存储
                                              3.遇到len长度的连续1即pow(2,len) - 1 的十进制时停止

      3.将字符串与二进制数对应:
                             输出ch[Sequence[i]];


*/

/*
                      注意:1.sizeof(buffer)给出的字节数
                                2.memset()只能赋值初始化0或者-1;
                      致命逻辑bug:字符串与二进制数不一定按从大到小的顺序数据对应。(致命,导致差点要推翻重写)
*/

例题代码:

#include<stdio.h>
#include<string.h>
#define Maxn 100000

int readchars() {
     int ch;
     for(; ;){
         ch = getchar();
         if(ch!='\n' && ch!='\r')  return ch;
     }
}

int readint(int c){
     int v = 0;
     while(c--)  v = v*2 + readchars() - '0';
     return v;
}

int Binary[8][1<<8];         //将1左移八位 1*pow(2,8);
int readcodes(){
     memset(Binary, 0 , sizeof(Binary));
     Binary[1][0]=readchars();
     for(int len = 2; len <= 7; len++){
        for(int i = 0 ; i< (1<<len)-1; i++){               //表示1的二进制左移len位。每一个长度有的十进制数与长度有关
          int ch = getchar();
          if(ch == EOF) return 0;
          if(ch =='\n' || ch == '\r') return 1;
          Binary[len][i] = ch;
        }
    }
}


int main()
{
     while(readcodes()){
           for(; ; ){
              int len = readint(3);
              if(len == 0) break;
                for(; ;){
                  int v = readint(len);
                  if(v == (1<<len)-1) break;
                  putchar(Binary[len][v]);
                }
           }
     putchar('\n');
    }
}



ZhiZhenSum

#include<stdio.h>
#include<math.h>
/*
int sum (int *a , int b)
{
    int ans = 0;
    for(int i = 0 ; i<b ; i++){
        ans += a[i];
    }
    return ans;
}
*/

/*
int sum(int * begin,int * end){
       int n = end - begin;
       int ans = 0;
       for(int i = 0; i<n ; i++)
            ans += begin[i];
       return ans;
}
*/

int sum(int * begin,int * end){
        int *p = begin;
        int ans = 0;
        for(int *p = begin; p!=end; p++)
            ans += *p;
        return ans;
}
int main(){
     int a[] = {1,2,3,4};
     //printf("%d\n",sum(a+1,3));
     //printf("%d\n",sum(a,a+3));
     printf("%d\n",sum(a,a+4));
     return 0;
}


ZuHeShu

#include<stdio.h>
#include<math.h>


long long last(int n , int m){
       if(m<n-m) m = n-m ;     //使运算次数减少
       int ans = 1;
       for(int i = m+1 ; i<= n ; i++) ans *= i;
       for(int i = i ; i<=n-m ; i++) ans /= i;
       return ans;
}


int main()
{
        printf("%I64d\n",last(21,1));
}


/*
    1.根据组合公式,实际上 last(21,1)==last(21,21-1);
    2. n!/m! = (m+1)(m+2)(m+3)...(n-1)n;
*/

ExampleTheDoleQueueUVa133

自写(TimeLimited)

#include<stdio.h>
#include<string.h>
int beginA = 1;
int beginB;
int N ;

void startf(int *a , int k , int m , int length){
                for( int j = k ; ; ){
                         if(a[beginA]!=0){
                              j--;
                         }
                         beginA++;
                         if(beginA == length+1) beginA = 1;
                         if(a[beginA]!=0&&j==1){
                             printf("%3d",a[beginA]);
                             N--;
                             a[beginA] = 100;
                             break;
                         }
                }
                for(int  j = m ; ; ){
                         if(a[beginB]!=0){
                              j--;
                         }
                         beginB--;
                         if(beginB == 0)  beginB = length;
                         if(j==1&&a[beginB]!=0){
                             if(a[beginB]!=100) {
                                printf("%3d",a[beginB]);
                                N--;
                             }
                             break;
                         }
                }
                a[beginB] = 0;
                a[beginA] = 0;
                if(N>0) printf(",");
         }

int main()
{
     int length,k , m;
     int a[21];
     while(scanf("%d%d%d",&N,&k,&m)==3 && N!=0&&k!=0&&m!=0){
         beginB = N;
         length = N;
         for(int i = 1 ; i<=length ; i++){
                     a[i] = i;
         }
        while(N>0){
            startf(a,k,m,length);
        }
        printf("\n");
     }
    return 0;
}



/*
      全局变量 int beginA , int beginB;
      1.输入N,k,m 分别代表人数,第一个官员A抽的人数间隔,第二个官员B抽的人数间隔.

      2.int N , k , m 并输入,当三者都为0时结束.
         int a[20] 放入各项数字

      3. 新建一个方法. 传入数组头指针. 传入全局变量beginA,beginB. 传入k. 传入m
          根据循环的方式,将A首先选中的人的数组变为数字100(N<=20)
                                     当B最后选中的人是A选中的100时将beginB顺时针减一(注意在一头一尾的情况)
      4.

*/

例题代码:

#include<stdio.h>
#define maxn 25
int n,k,m,a[maxn];

int go(int p , int d ,int t){
     while(t--){
         do{ p = (p+n+d-1)%n+1; }  while(a[p]!=0);   //算法中心,可以根据周期函数的一些特性推断
     }                                               //中心是将正循环变为原位,负循环变为下一个周期对应数
     return p;
}

int main()
{
     while(scanf("%d%d%d",&n,&k,&m)==3 && n){
           for(int i = 1; i<=n ; i++) a[i] = i;
           int left = n;                               //剩下的人数
           int p1 = n , p2 = 1;
           while(left){
               p1 = go(p1,1,m);
               p2 = go(p2,-1,k);
               printf("%3d",p1); left--;
               if(a[p2]!=a[p1]){
                   printf("%3d",p2);
                   left--;
               }
               a[p1] = a[p2] = 0;
               if(left) printf(",");
           }
     }
     return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37632283/article/details/80780837