题目描述
给N个数,判断这N个数中存在多少组勾股数(勾股数:存在三个数满足a*a + b*b = c*c)。
输入
第一行输入一个数T(1<=T<=50),表示有T组数据。
每组数据输入一个N(1<=N<=1000)。
接下来N个数ai(1<=ai<=10^9)。
输出
每组数据输出一行,表示有多少组勾股数。
示例输入
3 4 4 3 5 3 4 6 7 8 10 5 6 7 8 9 5
示例输出
2 1 0
2分的应用,
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int cmp(int a,int b) { return a<b; } long long a[10005]; int main() { int m,n; int t,j,i,l,mid,r; long long s1,s2,s; scanf("%d",&t); while(t--) { s2=0; scanf("%d",&m); for(i=0; i<m; i++) scanf("%d",&a[i]); sort(a,a+m,cmp); for(i=0; i<m; i++) { for(j=i+1; j<m; j++) { s1=a[i]*a[i]+a[j]*a[j]; l=j+1; r=m-1; while(l<=r) { mid=(l+r)/2; s=a[mid]*a[mid]; if(s==s1) { s2++; break; } else if(s>s1) r=mid-1; else if(s<s1) l=mid+1; if(l>r) break; } } } printf("%lld\n",s2); } return 0; }
下面是暴力过的
#include<stdio.h> #include<string.h> #include<math.h> int main() { int T,n,a[10010]; scanf("%d",&T); int b[10010],i,j; while(T--) { int count = 0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } int r = 0; for(i=0;i<n;i++) { for(j=i;j<n;j++) { double k; k = sqrt(a[i]*a[i] + a[j]*a[j]); int t; t = k; if(k - t == 0) { b[r++] = t; } } } for(i=0;i<r;i++) { for(j=0;j<n;j++) { if(a[j] == b[i]) { count++; } } } printf("%d\n",count); } return 0; }