project-euler/a094.cpp

47 lines
1.3 KiB
C++
Raw Normal View History

#include <iostream>
#include <cmath>
#include <chrono>
#define pmax 1000000000ll
using namespace std;
typedef long long var;
template<typename T> inline bool isSquare(T val) {
T root = (T)sqrt((double)val);
return root*root == val;
}
int main() {
auto start = chrono::system_clock::now();
var perimeterSum = 0;
var count = 0;
for (var equalSide = 3; equalSide <= pmax/3+1; equalSide += 2) {
var otherSide = equalSide-1;
var s = equalSide + otherSide/2;
if (isSquare(s*(s-otherSide)) && 2*s <= pmax) {
perimeterSum += 2*s;
count++;
cout << "(" << equalSide << "," << equalSide << "," << otherSide << ")" << endl;
}
otherSide = equalSide+1;
s = equalSide + otherSide/2;
if (isSquare(s*(s-otherSide)) && 2*s <= pmax) {
perimeterSum += 2*s;
count++;
cout << "(" << equalSide << "," << equalSide << "," << otherSide << ")" << endl;
}
}
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
cout << "solving took: " << elapsed_seconds.count() << endl;
cout << "perimeter count: " << count << endl;
cout << "perimeter sum: " << perimeterSum;
return 0;
}