「牛の舌って薄いんですね」

蒼樹うめ『ひだまりスケッチ』第 6 巻「一頭から一枚」より

ふみをチャレンジ[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;
}

反省

ガウスジョルダン法とか、連立方程式の解き方はいくつかあるみたいだけど、難しいそうだったので、普通に方程式解いてみた。最初、Wrong Answerを食らったが、以下の記事のように、0.0を付加すると通った。なんでーーー

AOJ 0004 Simultaneous Equation - Code Court

ふみをチャレンジ[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つだけを求めることにした。なんか他に方法ないかなあ。