// Problem 39// 14 March 2003//// If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120.//// {20,48,52}, {24,45,51}, {30,40,50}//// For which value of p <= 1000, is the number of solutions maximised?#include <iostream>#include <windows.h>#include <ctime>using namespace std;//************************************// Method: IsRightAngleTriangle// FullName: IsRightAngleTriangle// Describe: 判斷三角形是否為直角三角形// Access: public// Returns: bool// Qualifier:// Parameter: int leg1直角邊1// Parameter: int leg2直角邊2// Parameter: int leg3斜邊//************************************inline bool IsRightAngleTriangle(int leg1, int leg2, int leg3){ return leg1 * leg1 + leg2 * leg2 == leg3 * leg3;}void F1(){ cout << "void F1()" << endl; LARGE_INTEGER timeStart, timeEnd, freq; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&timeStart); const int MAX_PERIMETER = 1000;//最大的邊長和 int maxCount = 0;//所有周長中,能組成的最多的直角三角形個數 int maxCountPerimeter = 0;//能組成的最多的直角三角形個數的周長 int count = 0;//當前的周長能組成的直角三角形個數 //邊長和,取值範圍[3,MAX_PERIMETER] for(int perimeter = 3; perimeter <= MAX_PERIMETER; ++perimeter) { //初始化 count = 0; //第三邊,取值範圍[1,perimeter/2) for(int leg3 = perimeter / 2; leg3 > 0; --leg3) { //直角邊1,取值範圍[1,leg3) for(int leg1 = 1; leg1 < leg3; ++leg1) { //直角邊2 int leg2 = perimeter - leg1 - leg3; //如果是直角三角形 if(IsRightAngleTriangle(leg1, leg2, leg3)) { count++; } } } //記錄最大值 if(count > maxCount) { maxCount = count; maxCountPerimeter = perimeter; } } cout << "能組成最多直角三角形個數的周長為" << maxCountPerimeter << ",一共" << maxCount << "個" << endl; QueryPerformanceCounter(&timeEnd); cout << "Total Milliseconds is " << (double)(timeEnd.QuadPart - timeStart.QuadPart) * 1000 / freq.QuadPart << endl; time_t currentTime = time(NULL); char timeStr[30]; ctime_s(timeStr, 30, ¤tTime); cout << endl << "By GodMoon" << endl << timeStr;}//主函數int main(){ F1(); return 0;}/*void F1()能組成最多直角三角形個數的周長為840,一共16個Total Milliseconds is 2082.55By GodMoonWed Apr 11 11:20:42 2012*/