2670 - 直角三角形周长
中国石油大学(北京)2014级计算机系的美女帅哥们都很喜欢数学,某生刚好就遇到一个有(ke)趣(wu)的问题。一个直角三角形的周长是120的话,那么它的三边可以是20,48,52,或者24,45,51,还有30,40,50,有3种不同的解。现在你想知道如果给定一个直角三角形的周长,那么这个周长最多能有多少解呢?假设边长为整数。
Input
<span style="font-family:宋体;font-size:13.5pt;">第一行一个</span><span style="font-family:'Microsoft Yahei','serif';font-size:13.5pt;">T</span><span style="font-family:宋体;font-size:13.5pt;">表示</span><span style="font-family:'Microsoft Yahei','serif';font-size:13.5pt;">T</span><span style="font-family:宋体;font-size:13.5pt;">组测试数据。</span><span style="font-family:'Microsoft Yahei','serif';font-size:13.5pt;">1<=T<=10000</span><span style="font-family:'Microsoft Yahei','serif';"> </span>
每组测试数据占一行仅含一个整数A。0<=A<=100000
<span style="font-family:宋体;font-size:13.5pt;"></span>
Output
根据每组测试数据请求出以整数A为周长的直角三角形的个数。(边长都为整数的直角三角形且周长为整数A)
Examples
Input
3 12 120 55440
Output
1 3 40
Solution C
#include <stdio.h> #define M 100000 int arr[M+1]; int gcd(int a, int b) { if(b==0) return a; else return gcd(b, a%b); } void init() { int i, j, x, y, z; for(i=1; i<=800; ++i) for(j=i+1; 2*j*j+2*j*i<=M; ++j) { x=2*i*j; y=j*j-i*i; z=j*j+i*i; //确保x,y,z互质 if(gcd(gcd(x, y), z) == 1) { int t = x+y+z; int tmp = 1; while(tmp*t <= M) { arr[tmp*t]++; ++tmp; } } } } int main() { init(); int T, i, A; scanf("%d", &T); for(i = 1; i <= T; i++) { scanf("%d", &A); printf("%d\n", arr[A]); } return 0; }
Solution C++
#include<iostream> using namespace std; int main() { int i; //存储测试数据的组数 int j; //循环变量 int t1,t2; int a; //边长1 int b; //边长2 int c; int n; int n1; long long int area = 0; cin >> i; int *counter = new int[i]; //记录对应周长符合条件的直角三角形的组数 for(j = 0; j < i; j++) { cin >> n; counter[j] = 0; n1 = n*0.5; for(a = n/4+1; a < n1; a++) { area = a*a; t1 = (n-a)/2; t2 = n/2 - a +1; if(t2 > a) continue; for(b = t2; b < a && b < t1; b++) { c = n - a - b; if(c*c == area+b*b) { counter[j]++; } } } } for(j = 0; j < i; j++) { cout << counter[j] << endl; } delete [] counter; return 0; }