Project Euler 138

Project Euler 138

本文关键字:Euler Project      更新时间:2023-10-16

问题138

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

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

L=sqrt(1.25b2-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;
}

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

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