勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。
已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。
求满足这个条件的不同直角三角形的个数。
【数据格式】
输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。
例如,输入:
5
程序应该输出:
1
再例如,输入:
100
程序应该输出:
2
再例如,输入:
3
程序应该输出:
因为没考虑到平方后可能超过int所能表示的精度范围,所以要用long long来表示:
已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。
求满足这个条件的不同直角三角形的个数。
【数据格式】
输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。
例如,输入:
5
程序应该输出:
1
再例如,输入:
100
程序应该输出:
2
再例如,输入:
3
程序应该输出:
0
精度不够的代码:
#include<stdio.h>
int main()
{
int i,j;
int n;
int count=0;
scanf("%d",&n);
for(i=1;i<n;i++)
{
for(j=i;j<n;j++)//不是j=1,不然算2遍
{
if(i*i+j*j==n*n)
{
count++;
}
}
}
printf("%d\n",count);
}
因为没考虑到平方后可能超过int所能表示的精度范围,所以要用long long来表示:
要注意的是平方之后容易超出int的范围,用上longlong,最好不要用double,double在判等的时候精度问题容易错。暴力的时候穷举到 c/sqrt(2)就行了,也是一个优化点。
标准代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
long long aa,bb,cc;
int a,b,c,count=0;
scanf("%d",&c);
cc = c*c;
for(a=1;a<c/sqrt(2);a++)
{
aa = a*a;
b = sqrt(cc-aa);//b等于斜边的平方-另一边的平方再开方
if(b*b+aa==cc)
{
count++;//加1
}
}
printf("%d\n",count);
return 0;
}
注意那个sqrt(2)
#include<stdio.h>
#include<math.h>
int main()
{
int n = 1000;
float c = sqrt(2);
// printf("int %d\n",sizeof(int));//4
printf("%f",c);//1.414214
return 0;
}