• C语言:二进制模5


    输入一串字符,若是二进制则求其模五的值

    要求:1、若输入的字符包含除0、1以外的值,则输出:invalid

    2、若输入的为二进制字符串,则输出所计算的其模五的值

    3、若其输入字符均为0、1,但是第一个输入的字符为0则输出:irregular

    思路:可以参照所学的形式语言与自动机理论里面的自动机思想来做题:通过对输入的字符进行一个个的判断,从而输出所求的值,根据相应的状态再进行输出。

    根据题意可以判断出非0、1外的输入都是invalid,所以可以根据这个特点设定它的开始状态state=invalid,后面根据输入字符判断,建议在做题目前可以先画自动机状态图,这样有助于理清思路,避免写的时候出现思绪混乱。另外值得注意的是输入的字符串可能一开始是0、1组成,后面就是其他字符再加0、1组成的字符串的情况,这个时候是invalid状态,若像我这样写的就一定要注意跳到break了,不然会导致判断错误,所以一定要注意到这个情况。

    这个题也可以用if...else  if...else...等语句嵌套,也可以不用宏定义每个状态值,直接用1、2、3、4.。。。等等数字作为状态,只要语法无错误都可。

     1 #include<stdio.h>
     2 #define x0 0
     3 #define x1 1
     4 #define x2 2
     5 #define x3 3
     6 #define x4 4
     7 #define x5 5
     8 #define invalid 6
     9 #define irregular 7
    10 int FA(int state,char input);
    11 int main()
    12 {
    13    char a[10000];
    14    int state,i=0;
    15    gets(a);
    16    state=invalid;
    17    while(a[i]!='')
    18    {
    19        state = FA(state,a[i]);
    20        i++;
    21        if (state==invalid)
    22            break;
    23    }
    24    if (state==x0 || state==5)
    25        printf("0
    ");
    26    else if (state==x1)
    27        printf("1
    ");
    28    else if (state==x2)
    29        printf("2
    ");
    30    else if (state==x3)
    31        printf("3
    ");
    32    else if (state==x4)
    33        printf("4
    ");
    34    else if (state==6)
    35        printf("invalid
    ");
    36    else if (state==7 )
    37        printf("irregular
    ");
    38    return 0;
    39 }
    40 int FA(int state, char input)
    41 {
    42 switch(state)
    43 {
    44 case invalid:
    45     if(input == '1') state=x1;
    46     else if(input == '0') state=x5;
    47     else state=invalid;
    48     break;
    49 case x0:
    50     if(input == '1') state=x1;
    51     else if(input == '0') state=x0;
    52     break;
    53 case x1:
    54     if(input == '1') state=x3;
    55     else if(input == '0') state=x2;
    56     else state=invalid;
    57     break;
    58 case x2:
    59     if(input == '1') state=x0;
    60     else if(input == '0') state=x4;
    61     else state=invalid;
    62     break;
    63 case x3:
    64     if(input == '1') state=x2;
    65     else if(input == '0') state=x1;
    66     else state=invalid;
    67     break;
    68 case x4:
    69     if(input == '1') state=x4;
    70     else if(input == '0') state=x3;
    71     else state=invalid;
    72     break;
    73 case x5:
    74     if(input == '0' || input == '1') state=irregular;
    75     else state=invalid;
    76     break;
    77 case irregular:
    78     if(input == '0' || input == '1') state=irregular;
    79     else state=invalid;
    80     break;
    81     }
    82     return state;
    83     }
  • 相关阅读:
    Count on a Tree II
    DZY Loves Math
    二次剩余
    exCRT & 骆克强乘法
    CF 585 E Present for Vitalik the Philatelist
    Dirichlet 前缀和的几种版本
    51nod 1630(定积分 + 期望)
    Atcoder刷题小记
    3194. 【HNOI模拟题】化学(无标号无根树计数)
    3754. 【NOI2014】魔法森林(LCT)
  • 原文地址:https://www.cnblogs.com/zyxdjyd/p/10738822.html
Copyright © 2020-2023  润新知