勾股数元组
标题:勾股数元组 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限
如果3个正整数(a,b,c)满足a2 + b2 = c2的关系,则称(a,b,c)为勾股数(著名的勾三股四弦五),为了探索勾股数的规律,我们定义如果勾股数(a,b,c)之间两两互质(即a与b,a与c,b与c之间均互质,没有公约数),则其为勾股数元祖(例如(3,4,5)是勾股数元祖,(6,8,10)则不是勾股数元祖)。请求出给定范围[N,M]内,所有的勾股数元祖。
#include<iostream> #include<vector> #include<algorithm> using namespace std; bool ispain(int a, int b) { if (a == 1 || b == 1) { return 1; } while (1) { int t = a % b; if (t == 0) { break; } else { a = b; b = t; } } if (b > 1) { return 0; } return 1; } int main() { int n, m; cin>>n>>m; vector<vector<int>> ans; for (int i = n; i <= m - 2; i++) { for (int k = m; k > i + 1; --k) { if (!ispain(i, k)) { continue; } int t = (k - i) * (k + i); for (int j = k - 1; j > i; --j) { if (ispain(i, k) && ispain(j, k) && t == j * j) { ans.push_back({i, j, k}); } } } } if (ans.empty()) { cout<<"NA"<<endl; } sort(ans.begin(), ans.end(), [] (auto &a, auto &b) { if (a[0] > b[0]) { return 0; } else if (a[0] == b[0]) { if (a[1] > b[1]) { return 0; } else if (a[1] == b[1]) { if (a[2] > b[2]) { return 0; } } } return 1;}); for (auto & s : ans) { cout<<s[0]<<" "<<s[1]<<" "<<s[2]<<endl; } return 0; }
import math start = int(input()) end = int(input()) LEN = math.ceil(math.sqrt(end)) ans = [] for i in range(1, LEN): for j in range(i + 1, LEN): # check gcd if math.gcd(i, j) != 1: continue a = j ** 2 - i ** 2 b = 2 * i * j if a < start or b < start: continue c = i ** 2 + j ** 2 if c <= end: if math.gcd(a, b) == 1 and math.gcd(a, c) == 1 and \ math.gcd(b, c) == 1: t = [a, b, c] t.sort() ans.append(t) if len(ans) > 0: ans.sort() for t in ans: print(f"{t[0]} {t[1]} {t[2]}") else: print("NA") //manfen