白菜君の三角形T 3180計ニンニク客

7703 ワード

情報学入門試合18この問題を書いてください.タイトルリンク
白菜君もこのゲームに加わって、今はルールが少し変わった.現在、直角三角形の斜辺としてnの長さの棒がある.ニンニク君、ブロッコリー妹、白菜君は多くの整数の長さの棒の中から3本を選んで、それぞれa,b,cに成長します.現在、ニンニク君とブロッコリー妹の棒は直角辺a+bを構成し、白菜君は別の直角辺cを構成し、a+b≦cを要求している.すみません、全部で何種類の棒を取る案がありますか?ヒント:a=3,b=4はa=4,b=3と同じスキームとする.入力フォーマット入力は1行で、整数nであり、1≦n≦106出力フォーマット出力は1行であり、整数であり、棒を取るシナリオ数である.
サンプル入力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
"
,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
"
,ans); return 0; }

ところで、上のコードはc言語のように見えます.ただし、提出するときは必ずc++に設定して提出しないと通過しません.