테스트 사이트 - 개발 중인 베타 버전입니다

피타고라스의 수

· 11년 전 · 5056 · 5

아래의 문제의 답을 도출하는 과정을 프로그래밍 언어로 구현하시오.(php, javascript... 뭐든 좋습니다)

 

 

세 자연수 a, b, c (a<=b<=c) 에 대해 a^2 + b^2 = c^2 를 만족하는 쌍을 피타고라스의 수라고 합니다.

 

우리가 대표적으로 알고 있는 피타고라스의 수는 (3 ,4, 5) , (5, 12, 13) 등이 있지요.


문제) a^2 + b^2 = c^2 (a<=b<=c, a,b,c 는 자연수) 를 만족하는 피타고라스의 수 중에서 c 가 100보다 작은 모든 피타고라스의 수 를 구하시오 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 5개

흠.. 숙제는 직접 ㅋㅋㅋ



농담인거 아시죠? ^.^
<?php

set_time_limit(0);
//ini_set('memory_limit','1G');
header('Content-Type: text/html; charset=utf-8');



/*
원시 피타고라스의 수를 찾아서
각 그것들의 배수들이 모든 피타고라스의 수가 된다.



원시 피타고라스의 수를 찾는 방법

(1) m과 n은 모두 홀수이다.
(2) m과 n은 서로 소이다.

자연수 m, n (m > n) 에 대해서
a = mn
b = (m^2 - n^2)/2
c = (m^2+n^2)/2

참고 http://ko.wikipedia.org/wiki/%ED%94%BC%ED%83%80%EA%B3%A0%EB%9D%BC%EC%8A%A4_%EC%88%98

*/



function microtime_float() {

list($usec, $sec) = explode(" ", microtime());
return (((float)substr((string)$usec, 0, 4) + (float)$sec)) * 1000;
}



function get_excute_time($msg, $start_time){

$end_time = microtime_float();
$time = ($end_time - $start_time) / 1000;

echo "$msg : $time seconds" . PHP_EOL ;
}



// 팔팔이님 제공
function gcd ($p, $q) {

if ($q == 0) return $p;

return gcd ($q, $p % $q);
}



$start_time = microtime_float();



$input = 100;// c가 100 미만인 모든 피타고라스의 수

$default = Array();

//$n. $m 은 홀수, $n < $m, $n과 $m 은 서로소
for ($n = 1; $n < $input; $n++) {

for ($m = $n + 2; $m < $input; $m++) {

if (gcd ($m, $n) != 1)
continue;

$a = $m * $n;

$b_ = (pow($m, 2) - pow($n, 2));
$b = $b_ / 2;

$c_ = (pow($m, 2) + pow($n, 2));
$c = $c_ / 2;

if ($c >= 100)
break;

if ($b_ % 2 == 1 || $c_ % 2 == 1)
continue;

if ($a > $b) {

$t = $a;
$a = $b;
$b = $t;
}

$default[] = Array('a' => $a, 'b' => $b, 'c' => $c);
}
}


//print_r($default);
$result = $default;
foreach($default as $v) {

$i = 2;
while (1) {

$v['c_'] = $v['c'] * $i;
if ($v['c_'] >= 100)
break;

$v['a_'] = $v['a'] * $i;
$v['b_'] = $v['b'] * $i;

$result[] = Array('a' => $v['a_'], 'b' => $v['b_'], 'c' => $v['c_']);

$i++;
}
}

sort($result);
print_r($result);

get_excute_time("진행 시간", $start_time);

?>
// (1) m과 n은 모두 홀수이다. => 이므로 for문에서 홀수만 증가되도록 수정해 보았습니다.

$input = 100;

function gcd ($p, $q) {

if ($q == 0) return $p;

return gcd ($q, $p % $q);
}

for ($n = 1; $n < $input; $n += 2) {

for ($m = $n + 2; $m < $input; $m += 2) {

if (gcd ($m, $n) != 1) continue;

$c = ($m * $m + $n * $n) / 2;

if ($c >= $input) break;

$a = $m * $n;

$b = ($m * $m - $n * $n) / 2 ;

if ($a > $b) {
$t = $a; $a = $b; $b = $t;
}

printf('%d^2 + %d^2 = %d^2 <br>', $a, $b, $c);

}
}
2씩 더하는 것을 빼먹었네요

고맙습니다
너무나 좋은 답변 늘 감사합니다~

피타고리스의 수를 찾는 또다른 방법을 소개합니다.

일단 첫번째 방법으로 유창화님께서 소개해주신 방법

a^2 + b^2 = c^2 를 만족하는 a,b,c 쌍을 찾을 때,
a = mn
b = (m^2 - n^2)/2
c = (m^2+n^2)/2
를 만족하고,
(1) m과 n은 모두 홀수이다.
(2) m과 n은 서로 소이다.
를 만족하면 a, b ,c 는 피타고라스의 수가 됩니다.

다른 방법도 존재합니다.
a = 2n+1
b = 2 * n^2 + 2*n
c = 2 * n^2 + 2*n + 1
n 은 자연수

순서대로 대입하면
n =1 일 때 a = 3, b = 4, c = 5
n =2 일 때 b = 5, b = 12, c = 13

이런 식으로 구할 수 있습니다~

함수로 구현하는 건 패쓰............

게시글 목록

번호 제목
6461
6460
6456
6418
6391
6390
6379
6378
6377
6376
6360
6341
6329
6328
6327
6316
6305
6297
6291
6276
6256
6254
6238
6230
6208
6195
6189
6188
6187
6168