白菜君的三角形 T3180 计蒜客

信息学入门赛#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<n;i++)//枚举a+b
	 {
 		 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<n;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++提交才能通过。

你可能感兴趣的:(c++)