壁打ちAtCoder

AtCoderの問題をひたすら解いてくブログです。思考やコードの書き方の私的備忘録として

AtCoder Beginner Contest 052 by C

AtCoder Beginner Contest 052 の問題について
C言語での回答。

atcoder.jp

できたもの

  • A
  • B

できなかったもの

  • C
  • D

問題A

#include <stdio.h>

int main(void){
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);

    int rectangle1 = a*b;
    int rectangle2 = c*d;

    if(rectangle1>=rectangle2){
        printf("%d", rectangle1);
    }
    else{
        printf("%d", rectangle2);
    }
    return 0;
}

二つの長方形のうち、面積が大きい方の値を出力。
当初は分岐を複数書いていましたが、別にこれだけでいいんですよね。

問題B

#include <stdio.h>

int main(void){
    int n,i;
    char s[101];

    scanf("%d", &n);
    scanf("%s", s);

    int x = 0;
    int max = 0;
    for(i=0;i<n;i++){
        if(s[i]=='I'){
            x++;
        }
        else{
            x--;
        }

        if(x>max){
            max = x;
        }
    }
    printf("%d", max);

    return 0;
}

文字列Sにおいてs[i-1]がIならxの値を1増やし、Dなら1減らすというもの。if-elseの部分。
その操作中で採り得る最大値を出力するので操作1回ごとにmaxと比較して大きければ更新していきます。

問題C

#include <stdio.h>

#define devide 1000000007

int main(void){
    int n,i,j,tmp;
    int count[1000] = {0};
    long result=1;
    scanf("%d", &n);

    for(i=2;i<=n;i++){
        tmp = i;
        j = 2;
        while(tmp>1){
            if(tmp%j==0){
                count[j-1]++;
                tmp = tmp/j;
                j=2;
            }
            else{
                j++;
            }
        }
    }

    for(i=0;i<n;i++){
        result = (result * (count[i]+1))%devide;
    }

    printf("%ld\n", result);

    return 0;
}

n!の整数の約数を数える問題。
約数の数は元の数を素因数分解し、各累乗+1の相乗を取ると求まります。

素因数分解の部分が分からなかったため、他の方のコードを参考にしました。
良くできているなぁと感心したところ……

ちなみに自分が一番最初に考えたのはn!を計算し、1~n!までの数値で割ってあまりが0の回数を数えるというもの。
当然ながら数字が大きすぎてまず無理でした。(n=15程度でもうフリーズしました)

    long long int factorial = n;
    long long int factorial_tmp;
    for(i=1;i<n;i++){
        factorial_tmp = factorial * (n-i);
        factorial = factorial_tmp;
    }
    printf("階乗の結果:%lld\n",factorial);

    //約数を探す 1~factorialで割って、余りが0の個数をカウントする
    long long int count = 0;
    for(i=1;i<factorial+1;i++){
        if(factorial%i==0){
            count++;
        }
    }

1000!>10^2000らしいです。やばいね。

解けなかった原因

1.約数の個数の計算方法があるのを知らなかった(忘れていた)
2.素因数分解を行い、乗数を数える方法が分からなかった

問題D

まだ