質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

2002年名古屋大学の入試問題について

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 2
  • VIEW 2,713

manman

score 269

(1 + 2001/2002)^(2002/2001)と(1 + 2002/2001)^(2001/2002)の大小を較べよ。

数学的解法によらないで、プログラミングで解いてください。
使用言語はC++、Ruby、Pythonのいずれかでお願いします。

ちなみに、私は以下のように解きました。
(ただし、両辺が等号で結ばれないことを前提にしています。)
from decimal import *
getcontext().prec = 30
i = 2001
j = 2002

if (Decimal(1) + (Decimal(i) / Decimal(j)))**(Decimal(j) / Decimal(i)) > (Decimal(1) + (Decimal(j) / Decimal(i)))**(Decimal(i) / Decimal(j)):
    print '(1 + 2001/2002)^(2002/2001)>(1 + 2002/2001)^(2001/2002)'    
else:
    print '(1 + 2001/2002)^(2002/2001)<(1 + 2002/2001)^(2001/2002)' 

追記
回答がついてから気がついたのですが、
上記の解き方でなく、素直に
i = 2001.0
j = 2002.0

print (1.0 + (i / j))**(j / i)
print (1.0 + (j / i))**(i / j) 
の出力結果が
2.00019299755
1.99980699269
なので、
(1 + 2001/2002)^(2002/2001) > (1 + 2002/2001)^(2001/2002)
とした方がいいと思いました。

一般に、二つの数の大小を比較する問題が出たときは、
「答えだけを示すのではなく、
(どの程度の計算精度を必要としたかわかるように)二つの数の計算結果を出力したあと、
答えを示す」
とした方がいいと思いました。
今回の場合、二つの数の計算結果を出力したことで
decimal を必要としない程度の計算精度でよかったのだとわかります。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

v1 = (1 + 2001.0 / 2002) ** (2002.0 / 2001)
v2 = (1 + 2002.0 / 2001) ** (2001.0 / 2002)

if v1 == v2
  cmp = " = "
elsif v1 > v2
  cmp = " > "
else
  cmp = " < "
end

puts   "(1 + 2001/2002)^(2002/2001) #{cmp} (1 + 2002/2001)^(2001/2002)"
puts   "#{v1} #{cmp} #{v2}"

実行結果:
(1 + 2001/2002)^(2002/2001)  >  (1 + 2002/2001)^(2001/2002)
2.000192997549895  >  1.9998069926912556

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/11/24 07:15

    function として (1+1/x)**x の値を求めるものを定義したほうがよかったかもしれません。
    ちなみに なんらかのグラフ描画ソフトをつかって (1+1/x)**x を描画させると、x != 0 の部分では常に単調増加なことがわかります。(Mac なら graphe を使って確認できます。)
    この式を微分すると常に 0 なことからも単調増加なことがわかりますが。

    キャンセル

+2

(既にでている記述を参考に書いてみました)

require 'bigdecimal'

precision = 30
n = BigDecimal(   '1', precision)
i = BigDecimal('2001', precision)
j = BigDecimal('2002', precision)

a = (n + i/j)**(j/i)
b = (n + j/i)**(i/j)

string_build = proc { |cmp, i, j, n|
  i, j, n = [i, j, n].map(&:to_i)
  ret = ''
  ret << "(#{n} + #{i}/#{j})^(#{j}/#{i})"
  ret << "#{cmp}"
  ret << "(#{n} + #{j}/#{i})^(#{i}/#{j})"
}

cmp =
  if a == b
    '='
  elsif a > b
    '>'
  else
    '<'
  end

puts string_build.call(cmp, i, j, n)
# => (1 + 2001/2002)^(2002/2001)>(1 + 2002/2001)^(2001/2002)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る