AtCoder Beginner Contest 052 by C
AtCoder Beginner Contest 052 の問題について
C言語での回答。
できたもの
- 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
まだ