项目欧拉138

时间:2012-09-15 21:40:01

标签: c++

Problem 138

基本上,它要求等腰三角形,其中三角形的高度等于基数+ - 1.在纸上做一些数学运算后,我使用以下两个方程中的任何一个来计算长度 L 给出 b

L = sqrt(1.25b 2 + 2b + 1),用b + 1取代h

L = sqrt(1.25b 2 - 2b + 1),用b - 1取代h

我的以下代码使用这两个等式从 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;
}

我做错了什么?我想提示不是解决方案......我觉得这应该给我正确答案。

1 个答案:

答案 0 :(得分:0)

这是一个数值精度不足的情况。我只是复制了你的代码,并根据我是使用64位(double)还是80位(long double)算法得到了不同的答案。当然,出于同样的原因,80位答案可能仍然是错误的......你必须使用精确(整数)算法才能100%确定(并避免溢出)。