ふみをチャレンジ[6]
時間がない…とりあえず記事の作成だけ。
すっかり忘れてた。早く寝たいのに…
問題
0005: GCD and LCM - AIZU ONLINE JUDGE
結果から先に言うと、正解できてない。したがって以下は不正解の答案を載せてある。
答案
C
#include <stdio.h> long gcd(long, long); long lcm(long, long); int main() { long a, b; while(~scanf("%ld %ld", &a, &b)) { printf("%ld %ld\n", gcd(a, b), lcm(a, b)); } return 0; } long gcd(long m, long n) { long r; while(n) { r = m % n; m = n; n = r; } return m; } long lcm(long m, long n) { return m * n / gcd(m, n); }
反省
ユークリッドの互除法を用いてコードを書いてみたが、結果はWrong Answer。intをlongに換えてみたりしたけど、何が問題なのかよく分からない…今日は早く寝たいので明日また考えることにする。
[追記] (2012-01-13)
もう一度、挑戦した。
#include <stdio.h> int main() { long long unsigned int a, b, m, n, r, gcd, lcm; while(~scanf("%llu %llu", &a, &b)) { m = a; n = b; while(n) { r = m % n; m = n; n = r; } gcd = m; lcm = a * b / gcd; printf("%llu %llu\n", gcd, lcm); } return 0; }
long型にしてたのをlong long unsigned int型に換えたらうまくいった。あと、LCM求めるときにGCDを再度求めてるのが気に食わなかったので、全部をmain関数の中に放り込んである。
ふみをチャレンジ[5]
夜型の生活を1日で改められるわけもなく、お昼で断念して帰ってきた。無駄に体がだるい。
問題
0004: Simultaneous Equation - AIZU ONLINE JUDGE
これだけ妙に正答率が低いという、解く前から不安になるね。
答案
C
#include <stdio.h> int main() { double a, b, c, d, e, f, x, y; while(scanf("%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &e, &f) != EOF) { x = (c*e - b*f) / (a*e - b*d) + 0.0; y = (a*f - d*c) / (a*e - b*d) + 0.0; printf("%.3lf %.3lf\n", x, y); } return 0; }
ふみをチャレンジ[4]
三日坊主打破。ロックマンエグゼ2もついに最終話に突入して…ちょっとゲームしすぎかな。明日から大学だというのに。朝起きられるかなあ…
答案
C
#include <stdio.h> int main() { int n, a, b, c; scanf("%d", &n); while(n > 0) { scanf("%d %d %d", &a, &b, &c); a *= a; b *= b; c *= c; if(a == b + c || b == c + a || c == a + b) { printf("YES\n"); } else { printf("NO\n"); } n--; } return 0; }
反省
a2 + b2 = c2を利用すればいいとはすぐ分かったけど、斜辺をどうやって判定しようか…と考えてたら、なるほど、全部ORで繋いじゃったらいいんだ。ソートしたり最大の値を探すことも考えたけど、この方法が一番スマートだね。
ふみをチャレンジ[3]
とりあえず3日間やって来れた。三日坊主打破まであと1日。でも問題は明後日以降かな、大学始まるし。実はもう始まってるんだけど。ロックマンエグゼ2のハードモードが意外と難しい…
あと、ですます調やめた。
問題
0002: Digit Number - AIZU ONLINE JUDGE
桁数を求めるには、
figure = (int)log10( variable ) + 1
みたいにすればいいってここに書いてあったから、それを利用した。
答案
C
#include <stdio.h> #include <math.h> int main() { int a, b, sum, digit; while(scanf("%d %d", &a, &b) != EOF) { sum = a + b; digit = (int)log10(sum) + 1; printf("%d\n", digit); } return 0; }
反省
問題分の「入力の終わりまで処理して下さい」の意味がわからなくて、whileを無限ループにして提出したらTime Limit Exceededだと言われた。AOJのWEB Boardで確認すると、
while(scanf("%d", &n) != EOF) { /* ここに処理 */ }
こういうことだったそうだ。なるほど。
後ろの方の問題をチラッと見たら、かなり難しそうなんだけど大丈夫かな…
ふみをチャレンジ[2]
ふみをチャレンジ2日目。せっかくなのでAOJに登録してみました。機械判定してくれるので便利ですね。foooomioが僕なので、見かけたらどうぞ笑ってやって下さい。
答案
C
#include <stdio.h> int main() { int a[10], i, num1, num2, num3; num1 = num2 = num3 = 0; for(i = 0; i < 10; i++) { scanf("%d", &a[i]); if(num1 <= a[i]) { num3 = num2; num2 = num1; num1 = a[i]; } else if(num2 <= a[i]) { num3 = num2; num2 = a[i]; } else if(num3 <= a[i]) { num3 = a[i]; } } printf("%d\n%d\n%d\n", num1, num2, num3); return 0; }
反省
ソートした方が簡単かと思った(Javaで作ったときはそうした)けど、比較関数書かないといけなかったりするそうなので、単純に上位3つだけを求めることにした。なんか他に方法ないかなあ。