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

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

ふみをチャレンジ[9]

AOJだんだん難しくなってきた…センター試験終わったね。受験生はこれから個人戦になるので、気を引き締め直して頑張ってください。あとでセンター問題解いてみるか。

答案

#include <stdio.h>

int main() {
  int a, b, c, d, n, count;
  
  while(~scanf("%d", &n)) {
    count = 0;
    for(a = 0; a < 10; a++) {
      for(b = 0; b < 10; b++) {
        for(c = 0; c < 10; c++) {
          for(d = 0; d < 10; d++) {
            if(a+b+c+d == n) count++;
          }
        }
      }
    }
    printf("%d\n", count);
  }
  
  return 0;
}

反省

もっとエレガントな方法はないのかと考えてたけど、結局全部求めることにした。最大でも50なのでTime Limit Exceededになることはなさそうということで。

ふみをチャレンジ[8]

センター試験1日目、受験生のみなさんお疲れ様です。残りの科目も頑張ってください。

答案

C

以下、Wrong Answer。

#include <stdio.h>
#include <math.h>

int main() {
  int n, debt = 100000;
  
  scanf("%d", &n);
  while(n > 0) {
    debt = ceil(debt * 1.05 / 1000) * 1000;
    
    n--;
  }
  
  printf("%d\n", debt);
  
  return 0;
}

反省

答え合ってるはずなんだけど…Wrong Answerが返される。なんでー??


[追記] (2012-01-15)
腑に落ちないのだが、他のブログに載っていた方法でやってみると、正解になった。
上の僕の方法がなぜ間違いになるか分かる方いらっしゃったら、指摘していただければ幸いです。

#include <stdio.h>

int main() {
  int n, debt = 100000;
  
  scanf("%d", &n);
  while(n > 0) {
    debt *= 1.05;
    if(debt % 1000 != 0) {
      debt += 1000 - (debt % 1000);
    }
    
    n--;
  }
  
  printf("%d\n", debt);
  
  return 0;
}

ふみをチャレンジ[7]

1週間やってこれた(∩´∀`)∩ワーイ
明日はセンター試験。受験生のみなさん、諦めずに最後まで頑張ってください!

答案

#include <stdio.h>

int main() {
  char str[21], *p;
  
  p = str;
  
  scanf("%s", str);
  while(*p) {
    p++;
  }
  while(p > str) {
    p--;
    putchar(*p);
  }
  putchar('\n');
  
  return 0;
}

反省

これはポインタを勉強したときに作ったことがあったので、簡単に作ることができた。手元の環境ではchar str[20]でも大丈夫だったけど、AOJではRuntime Errorと言われた。\0のスペースの問題なんだろうけど。

Twitterのプロフィールの下に「リストへの追加/削除」ボタンを追加するユーザースクリプト書いた

先日、Twitterでリストの整理をしていたら、間違ってブロックの項目を選んでしまい、フォロワーの方に迷惑をかけてしまった。2つのメニュー項目が隣接しているのが問題で、ブロック時の確認メッセージなど一切ない。また、マイリスト画面を開くためには、メニューを開き、項目をクリックするという二段階の動作が必要で、前々から面倒くさいと感じていた。以上の理由で、別の場所に「リストへの追加/削除」ボタンを追加するユーザースクリプトを書くことにした。
面倒くさかったのが、スクリプトの実行タイミング。onloadの時点では上のメニューバーしか読み込まれていない。DOMNodeInsertedをaddEventListenerして、必要な要素以外を弾けばいいようだ。他に方法があれば試してみたい。
なお、自分自身をリストに追加できなくなったため、自分のユーザータイムラインではボタンは表示されない。

インストール

Twitter List Button - userscripts.org
上記リンクよりインストールしてください。

ふみをチャレンジ[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関数の中に放り込んである。