プロジェクトオイラー問138

https://projecteuler.net/problem=138
2等辺三角形の高さと辺の長さに関する問題。


解法
小さいほうから原始ピタゴラス数を検討するだけです。
原始ピタゴラス数のk倍の辺をもつ三角形は高さがk倍の差になるので条件を満たしません。
原始ピタゴラス数のもととなるm,n(Wikiの記述に準拠)はmが定まれば今回の条件を満たすnは決まるのでmを小さいほうから試します。


#include<stdio.h>
#include<set>
#include<algorithm>
#include<iostream>
__int64 
gcd ( __int64 a, __int64 b )
{
 __int64 c;
 while ( a != 0 ) {
    c = a; a = b%a;  b = c;
  }
  return b;
} 


int main(){
	int c=0;
	__int64 ans=0;
	__int64 m=2;
	__int64 r=1;
 	__int64 n;
	
	while(c<12){
		while(5*m*m-1>r*r){
			r++;
		}
		if(5*m*m-1==r*r){
			n=-2*m+r;
			if((gcd(m,n)==1)&&(m-n)%2==1){
				c++;
 				ans+=(m*m+n*n);
			}
		}
		while(5*m*m+1>r*r){
 			r++;
		}
		if(5*m*m+1==r*r){
			n=-2*m+r;
			if((gcd(m,n)==1)&&(m-n)%2==1){
				c++;
				ans+=(m*m+n*n);
			}
		}
		m++;
	}
	std::cout<<"\nans="<<ans<<"\n";
}
最終更新:2015年11月30日 21:38