-1

問題138

基本的に、三角形の高さが底辺+1に等しい二等辺三角形を求めます。紙で数学を行った後、次の2つの方程式のいずれかを使用して、bが与えられた長さLを計算します。

L = sqrt(1.25b 2 + 2b + 1)、hをb+1に置き換え

また

L = sqrt(1.25b 2-2b + 1)、hをb-1に置き換え

私の次のコードは、両方の方程式を使用してbからLを計算します。私はすべてのL値を合計しますが、それは私に間違った答えを与え続けます。

#include <iostream>
#include <cmath>

int main(int argc, char* argv[]) {
  int result = 0;
  int count = 0;

  for (int b = 1; count < 12; b++) {
    double x;
    double L = std::sqrt(1.25*b*b + 2*b + 1);

    if (std::modf(L, &x) == 0.0) {
      std::cout << count << ": b=" << b << ", L=" << (int)L << "\n";
      result = result + L;
      count++;
    } 

    L = std::sqrt(1.25*b*b - 2*b + 1);
    if (count != 12 && std::modf(L, &x) == 0.0) {
      std::cout << count << ": b=" << b << ", L=" << (int)L << "\n";
      result = result + L;
      count++;
    }
  }

  std::cout << "Solution: " << result;
  std::cin.get();
  return 0;
}

私は間違って何をしていますか?解決策ではなくヒントが欲しいのですが…これで正解がわかるはずです。

4

1 に答える 1

0

数値精度が不十分な場合です。doubleコードをコピーしたところ、64ビット( )または80ビット()のどちらの演算を使用するかによって、異なる回答が得られましたlong double。もちろん、同じ理由で80ビットの答えはまだ間違っている可能性があります... 100%確実にする(そしてオーバーフローを回避する)には、正確な(整数)算術を使用する必要があります。

于 2012-09-15T22:09:46.317 に答える