時速40km/hで走る車Aと時速60km/hで走る事が出来る車がある。車AにX分先に出発して良いというハンディキャップを与えた時、追いつく時間(分)を計算するプログラミングを作成しなさい。
入力 ハンディキャップ時間(分)
出力 追いつく時間(分)
c言語を使用しています
どなたか解説お願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/03 13:04
回答1件
0
ベストアンサー
ハンディキャップ時間(分)をt
、追い越す時間(分)をx
とした場合
40[km/h] * (t[m] + x[m]) = 60[km/h] * x[m] (60 * 60 - 40 * 60) * x = 40 * 60 * t # km/hはkm/mに変換するため60を掛けている 1200 * x = 2400 * t x = t * 2
と単純に入力された値を2倍にすれば良い事になります。しかし、ここで一つ問題があります。それはハンディキャップ時間(分)の大きさに制限が無い事です。さすがにコンピューターの資源を超えることは無理なので、こういう場合はOS上のメモリが許す限りと考えなければなりません。
標準のC言語で用意される整数で一番大きいのは符号付きのintmax_t
と符号無しのuintmax_t
ですが、仕様上は64bit以上であることしか保証されておらず、それぞれたったの9223372036854775807
と18446744073709551615
までしか大きさは保証されていません。宇宙誕生から現在までの時間は収まりそうですが、無限とも思える時の果てまでの時間軸に比べれば刹那のように短いです。よって、より大きな整数を扱うために、多倍長整数を実装する必要があります。
しかし、多倍長整数はそう簡単に実装できるものではありません。ここらライブラリとしてGMPに頼ることにします。
C
1#include <stdio.h> 2#include <gmp.h> 3 4int main(void) { 5 mpz_t i; 6 mpz_t r; 7 mpz_init(i); 8 mpz_init(r); 9 printf("%s", u8"ハンデキャップ時間(分):"); 10 fflush(stdout); 11 mpz_inp_str(i, stdin, 10); 12 mpz_mul_ui(r, i, 2); 13 printf("%s", u8"追いつく時間(分):"); 14 mpz_out_str(stdout, 10, r); 15 printf("\n"); 16 return 0; 17}
コンパイル時は-lgmp
を付けることを忘れないで下さい。なおC11かつUTF-8環境しか想定していません。Windowsで実行する際はchcp 65001
等を実行しておいて下さい。
なお、上のコードは負の時間まで計算できてしまいます。過去に追い越していたと考えるのか、負の場合はエラーとするのかは考え所です。
外部ライブラリ使用禁止の場合、自分で多倍長整数を実装する必要があります。必要なのは掛け算だけ、それも2倍するだけとはいえ、簡単ではありません。他には一文字ずつスタックに積んでいく方法がありますが、そちらの方が良いかもしれません。
投稿2017/12/03 14:14
編集2017/12/03 15:12総合スコア21737
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/03 14:35
2017/12/03 15:06
2017/12/03 15:14
2017/12/03 15:21 編集
2017/12/03 21:44
2017/12/04 02:41
2017/12/04 09:23
2017/12/04 09:58
2017/12/04 14:31 編集
2017/12/04 15:08
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。