信息学入门赛#18
写一下这个题。
题目链接
白菜君也加入到这个游戏当中来了,现在规则发生了一些改变。目前有一个长度为 n 的木棍,当做直角三角形的斜边。蒜头君、花椰妹、白菜君要从许多整数长度的木棍中选出三根,分别长为 a,b,c。现在,蒜头君和花椰妹的木棍组成一条直角边 a+b,白菜君组成另外一条直角边 c,并且要求 a+b≤c。请问一共可以有多少种取木棍的方案。提示:a=3,b=4与 a=4,b=3算作同一种方案。
输入格式
输入为一行,是一个整数 n,1≤n≤106
输出格式
输出为一行,是一个整数,为取木棍的方案数。
样例输入1
5
样例输出1
1
样例输入2
26
样例输出2
5
写题的时候首先要注意声明要使用long long,并且格式说明符是%lld,这个一定要注意,太容易忘了。
其实,我觉得写题过程会使用floor函数也很重要。floor函数原型为double floor(double a),返回小于a的最大整数。
如果当时想不到用floor函数的话,用sqrt函数也可以,判断的话就是判断sqrt(a)*sqrt(a)==a.
在三边长度确定后,这组数据的方案数就是(a+b)/2。
原因?
你猜
代码如下:
#include
#include
int main()
{
long long n;
scanf("%lld",&n);//看清楚格式说明符
long long i;
int ans=0;
double ex;
for(i=1;i
{
ex=sqrt(n*n-i*i);//ex其实就是我们想找的c
if(ex==floor(ex))//如果ex是我们想找的c
{
if(ex>=i)//要保证c>=a+b
ans+=i/2;
}
}
printf("%d\n",ans);
return 0;
}
还有一个不用floor的版本
#include
#include
int main()
{
long long n,i,j,k;
int ans=0;
scanf("%lld",&n);
long long xixi;
for(i=1;i
{
k=n*n-i*i;
xixi=sqrt(n*n-i*i);
if(k==xixi*xixi)
{
if(xixi>=i)
{
ans+=i/2;
}
}
}
printf("%d\n",ans);
return 0;
}
对了,上面的代码看着很像是c语言。但是提交的时候一定要设置成c++提交才能通过。