AtCoderのA - 321-like Checkerをchar型とint型で解いてみた。

# 注意！
・以下のネタバレあり。

https://atcoder.jp/contests/abc321/tasks/abc321_a

# 学んだこと
<b>・隣同士を比較するときの for ループの条件式は、比較したい要素の数から 1 を引く必要がある。</b>
自分自身と自分の右隣の要素を比較するのでループが最後の要素に達したときには右隣の要素が存在しないため、エラーが発生する可能性がある。

<b>for文の構造</b>
```
for (初期化;条件式;変化式){
     実行する処理;
}
```
<b>・bool型の変数名を工夫する。</b>
ACしたコード && 解説してみたコードでは、flagという名前を使いましたが、復習の際にこの変数がどの状況でtrueになるのか分かりにくい。
今回の問題では、右隣の桁より左の桁（自分自身）の方が大きいかどうかを判定したいので、「左の桁の方が大きい」を英語にすると「The left digit is bigger.」となる。
結果、変数名をleftDigitIsBiggerに変更して、復習時に何を判定したかったのか理解しやすくなる。

<b>・条件分岐でfalseに判定された場合、breakを記述して不要な計算をしない。</b>


# char型でACしたコード && 解説してみた
```C
#include <stdio.h>
//boolを使う時に必要。
#include <stdbool.h>

int main(void){
    //問題文では、整数が標準入力から入力されるが、
    //文字列で受け取った方が判定しやすいと思ったのでchar型で受け取りました。
    char s[6];
    scanf("%s",s);
    //sの長さを調べるためにsCountを宣言している。strlen関数を使っても良い。
    //良いコードにしてみたで更新済み。
    int sCount = 0;    
    for(int i = 0; s[i] != '\0'; i++){
        // printf("%c",s[i]);
        sCount++;
    }
    // printf("%d",sCount);
    //boolの初期値をtrueにし、
    //以下のfor文の条件分岐で右隣の文字の方が大きいかつ、同じ場合はfalseを代入する。
    bool flag = true;
    //以下のfor文では、自分自身と自分の右隣の要素を比較するので
    //ループが最後の要素に達したときには右隣の要素が存在しないため、エラーが発生する可能性がある。
    for(int i = 0; i < sCount - 1; i++){
        //s[i + 1]と記述すると、自分の右隣と比較できる。
        //文字同士を比較するときはアスキーコードで比較しているので文字でも比較できる。
        if(s[i] <= s[i + 1]){
            flag = false;
        }
    }
    //flagがfalseの場合はNo、それ以外はYesを出力している
    if(flag == false){
        printf("No\n");
    } else {
        printf("Yes\n");
    }
    return(0);
}
```
# 良いコードにしてみた
```C
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main(void){
    
    char s[6];
    scanf("%s",s);
    
    int sCount = strlen(s);    
    // printf("sCount = %d",sCount);
    
    bool leftDigitIsBigger = true;
    for(int i = 0; i < sCount - 1; i++){
        if(s[i] <= s[i + 1]){
            leftDigitIsBigger = false;
            break;
        }
    }
    if(leftDigitIsBigger == false){
        printf("No\n");
    } else {
        printf("Yes\n");
    }
    return(0);
}
```
# int型でACしたコード
・良いコードあると思うけど、これが限界。
```C
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    
    int sCount = 0;
    int nDigit = n; 
    
    while (nDigit != 0) {
        nDigit /= 10; 
        sCount++;
    }
    
    // printf("sCount = %d\n", sCount);
    
    if(sCount == 5){
        int digit5 = (n / 10000) % 10; 
        // printf("digit5 = %d\n",digit5);
        int digit4 = (n / 1000) % 10; 
        // printf("digit4 = %d\n",digit4);
        int digit3 = (n / 100) % 10; 
        // printf("digit3 = %d\n",digit3);
        int digit2 = (n / 10) % 10; 
        // printf("digit2 = %d\n",digit2);
        int digit1 = n % 10; 
        // printf("digit1 = %d\n",digit1);
        
        if(digit5 > digit4 && digit4 > digit3 && digit3 > digit2 && digit2 > digit1){
            printf("Yes");    
        } else {
            printf("No");    
        }
    } else if(sCount == 4){
        int digit4 = (n / 1000) % 10; 
        // printf("digit4 = %d\n",digit4);
        int digit3 = (n / 100) % 10; 
        // printf("digit3 = %d\n",digit3);
        int digit2 = (n / 10) % 10; 
        // printf("digit2 = %d\n",digit2);
        int digit1 = n % 10; 
        // printf("digit1 = %d\n",digit1);

        if(digit4 > digit3 && digit3 > digit2 && digit2 > digit1){
            printf("Yes");    
        } else {
            printf("No");    
        }
    } else if(sCount == 3){
        int digit3 = (n / 100) % 10; 
        // printf("digit3 = %d\n",digit3);
        int digit2 = (n / 10) % 10; 
        // printf("digit2 = %d\n",digit2);
        int digit1 = n % 10; 
        // printf("digit1 = %d\n",digit1);
        
        if(digit3 > digit2 && digit2 > digit1){
            printf("Yes");    
        } else {
            printf("No");    
        }
    } else if(sCount == 2){
        int digit2 = (n / 10) % 10; 
        // printf("digit2 = %d\n",digit2);
        int digit1 = n % 10; 
        // printf("digit1 = %d\n",digit1);
        
        if(digit2 > digit1){
            printf("Yes");    
        } else {
            printf("No");    
        }
    } else if(sCount == 1){
        printf("Yes");    
    } else {
        printf("No");    
    }
    return(0);
}
```