출처 : 프로젝트 오일러 9번문제, 한글 번역판
세 자연수 a, b, c 가 피타고라스 정리 a^2 + b^2 = c^2 를 만족하면 피타고라스 수라고 부릅니다 (여기서 a < b < c ). 예를 들면 3^2 + 4^2 = 9 + 16 = 25 = 5^2 이므로 3, 4, 5는 피타고라스 수입니다.
a + b + c = 1000 인 피타고라스 수 a, b, c는 한 가지 뿐입니다. 이 때, a × b × c 는 얼마입니까?
138개의 풀이가 있습니다.
python 3.6 일단은 수학문제니까 수학적 설명을 좀 해야 할 것 같습니다. 미지수가 3개, 식은 2개니 값이 식만으로는 산출이 안되고 범위를 정해서 구해야 하죠. a+b+c = 1000, a+b > c 이므로(삼각형이니까) c < 500 이며 즉, a<b<c<500 입니다.
범위는 정해졌고, 어떤 것을 구하냐 인데. a, b 를 c 로 정리를 하면 c - b = a^2 / (1000-a), c - a = b^2 / (1000-b) 입니다. a term 으로 쓰든 b term 으로 정리하든 식은 같습니다. 그리고 이 모두 자연수이어야 하므로 식에서 나오는 두 수중 작은 것이 a, 큰 것이 b 가 됩니다. 그러면 c 는 당연이 1000-(a+b) 입니다.
한줄코드로 만들려고 했는데 한줄로 했더니 넘 지저분하고 가독성이 없어서 그냥 두줄로 만들었습니다.
import numpy as np
a_b = [i for i in range(1,500) if (i**2 / (1000-i)) % 1 == 0] # [200, 375]
print(np.prod(a_b) * (1000-sum(a_b))) # 200 * 375 * 425
31875000
for a in range(1,500):
for b in range(a,500):
for c in range(b,500):
if a*a+b*b==c*c:
if a+b+c==1000:
print(a*b*c)
Python으로 작성했습니다.
for a in range(1, 1000):
for b in range(1, 1000 - a):
c = 1000 - (a + b)
if (a**2 + b**2 == c**2) & (a < b < c):
print(a, b, c)
Ruby
Euclid's formula. s=1000일 때, sqrt(s/4) < m < sqrt(s/2)
풀이 1. one-liner
(16..22).each {|m| (1...m).each {|n| puts (m**4-n**4)*2*m*n if m*(m+n) == 500 }}
풀이 2. 일반화
prt = ->m,n,s { puts (m*m-n*n) * (m*m+n*n) * 2*m*n if m*(m+n) == s/2 }
ptm = ->s { (((s/4)**0.5).ceil..((s/2)**0.5).to_i).
each {|m| (1...m).each {|n| prt[m,n,s]}} }
Test
expect{ ptm[12] }.to output("60\n").to_stdout # 3+4+5=12, 3*4*5=60
expect{ ptm[1000] }.to output("31875000\n").to_stdout
python 최악의 복잡도 알고리즘.. 이지만 가장 빠른 코딩?이 아닐까 합니다.
def findPythagoreanTriplet():
for c in range(1000, 0, -1):
for b in range(c-1, 0, -1):
for a in range(b-1, 0, -1):
if a+b+c==1000 and a**2 + b**2 == c**2:
print("a*b*c={0}, a={1}, b={2}, c={3}".format(a*b*c, a, b, c))
findPythagoreanTriplet()
a*b*c=31875000, a=200, b=375, c=425
// 피타고라스 수의 합이 1000 - C
#include <stdio.h>
int main(void)
{
int a, b, c;
for (a = 1; a < 1000; a++)
for (b = 1; b < 1000; b++)
for (c = 1; c < 1000; c++)
if (a * a + b * b == c * c && a + b + c == 1000)
goto HOORAY;
HOORAY:
printf("%d, %d, %d, %d\n", a, b, c, a * b * c);
//200, 375, 425, 31875000
return 0;
}
a, b, c는 삼각형의 세 변의 길이이고 편의상 a <= b <= c 라고 하겠습니다.
이 때 a 는 1에서 333 까지 범위에 있을 수 있습니다. (a = b = c 일때가 가장 크겠죠)
a를 그 범위 중 특정한 값에 둔다면 b는 둘레의 길이를 P라 했을 때 a <= b <= (P - a) / 2 사이의 범위가 됩니다.
이 범위내에서 가장 긴 변인 c에 대해서 피타고라스 정리를 만족하는 쌍을 찾으면 되겠습니다.
Swift 입니다.
let p = 1000
main: for a in 1..<(p/3) {
for b in a..<((p-a)/2) {
let c = p - a - b
if c * c == a * a + b * b {
print(a * b * c)
break main
}
}
}
a<b<c, a^2+b^2=c^2
a+b+c=1000 ... (1), c < a+b < 2c ... (2)
(1) 에서 a+b=1000-c 를 (2)에 대입하면 c<1000-c<2c => 333
def pytha():
for c in range(334, 500):
for a in range(1, 1000 - c):
b = 1000 - c - a
if b > 0 and a*a + b*b == c*c:
return a*b*c
print(pytha()) # 31875000
for c in range(1,500):
for b in range(1,c-1):
for a in range(1,b-1):
if a*a + b*b == c*c and a+b+c == 1000:
print 'a = '+str(a)+' b = '+str(b)+' c = '+str(c)+'\n답 = '+str(a*b*c)
break
a = 200 b = 375 c = 425 답 = 31875000
for x in range(333):
for y in range(x,500):
z = 1000 - x - y
if z*z == x*x + y*y and x < y < z and x + y > z:
print("x값:",x,"y값:",y,"z값:",z)
object Problem9
{
def pow(a: BigDecimal, b : BigDecimal):BigDecimal = {
def realpow(a:BigDecimal, b : BigDecimal, r: BigDecimal): BigDecimal = if(b == 1) a*r else realpow(a,b-1,a*r)
realpow(a,b,1)
}
def ret(a : BigDecimal, b : BigDecimal): BigDecimal = a + b + sqrt((pow(a,2) + pow(b,2)).toDouble)
def search(i : BigDecimal, j : BigDecimal) : BigDecimal = if(ret(i,j) == 1000.0) i*j*sqrt((pow(i,2) + pow (j,2)).toDouble)
else if(ret(i,j) < 1000.0) search(i,j+1)
else search(i+1,i+1)
def main(args: Array[String]): Unit = print(search(1,1))
}
scala 입니다.
R로 작성했습니다.
for(a in 1:1000){
for(b in 1:(1000-a)){
c = 1000 - (a + b)
if((a^2 + b^2 == c^2) & (a < b)) print(c(a, b, c))
}
}
두 식을 연립해서 a,b에 대한 식으로 놓고 풀었습니다. 정답은31875000
def func():
for a in range(1,1000):
for b in range(1,1000):
result1 = 1000*(a+b)
result2 = a*b +500000
if result1 == result2:
return (1000 - (a+b))*a*b
print(func())
# python 3.6
# a + b + c = 1000, a^2 + b^2 = c^2 --> a^2 + b^2 = (1000 - (a+b))^2, where a < b < c
sol = [(a, b) for a in range(1, 1000) for b in range(1, 1000) if a**2 + b**2 == (1000 - (a + b))**2 and a < b]
a = sol[0][0]
b = sol[0][1]
c = 1000 - (a + b)
print(a * b * c)
# ans: 31875000
문제 레벨에 비해 구현 자체는 편이한 난이도 같네요.. 코드를 최대한 축약하는게 관건인가 싶기도 한데, 제 코드는 비교적 긴 것 같습니다. 어차피 if문으로 a+b+c==1000을 만족하면서 피타고라스 수도 동시에 만족하는 경우의 수를 찾기 때문에 실행 속도가 느리거나 하는 문제는 없는 것 같네요. JAVA로 더 다른 차선책이 있으면 궁금하네요.
public class SpecialPythagoreanTriplet {
public static void main(String[] args) {
for(int c = 1; c < 1000; c++) {
for(int b = 1; b < c; b++) {
for(int a = 1; a < b; a++) {
if(a +b +c == 1000 && (a*a) +(b*b) == (c*c)) {
System.out.print("A:" +a +" " +"B:" +b +" " +"C:" +c);
}
}
}
}
}
}
파이썬 3.6
def main(n):
for a in range(1,n):
for b in range(a+1,n):
c = 1000 - (a+b)
if a**2 + b**2 == c**2 and a+b+c == n:
print("a = %d, b= %d, c = %d, a x b x c = %d" %(a,b,c, a*b*c))
return
if __name__ == "__main__":
n = int(input("n = "))
main(n)
* 실행결과
n = 1000
a = 200, b= 375, c = 425, a x b x c = 31875000
b가 빗변일 때
b^2-c^2 = (b+c) * (b-c)=a^2 피타고라스의 정리
b-c = a^2 / b+c = a^2 / (1000-a)
b+c = 1000 - a
b-c와 b+c를 더해서
2b = 1000 - a + a**2/(1000-a)
b = (1000-a+a**2/(1000-a))/2
# 파이썬
for a in range(500):
b = (1000-a+a**2/(1000-a))/2
if b == int(b):
b = int(b)
c = 1000 - b - a
print(a, b, c, a*b*c)
import math
def pythagorean(n):
result = list()
for c in range(math.ceil(n/3), math.ceil(n/2)):
for b in range(math.ceil((n-c)/2),c+1):
if c**2 == b**2 + (n-c-b)**2:
result.append((n-b-c,b,c))
return result
print(pythagorean(1000))
print(pythagorean(1000)[0][0]*pythagorean(1000)[0][1]*pythagorean(1000)[0][2])
// a < b < c 이기 때문에 a는 332 보다 작거나 같다 (332 333 334)
// b 는 a보다 크고 c보다는 작다. a < b < (1000-a)/2
var ans = 1
for(a <- 332 to 1 by -1){
for(b <- a+1 until (1000-a)/2 -1 ){
if(Math.pow(a,2) + Math.pow(b,2) == Math.pow(1000-a-b,2)){
println(s"$a $b ${1000-a-b}")
ans = a * b * (1000-a-b)
}
}
}
println(ans)
자바입니다. 포문을 더 줄일 조건이 있을 거 같은데 수학 상식이 부족하네요
``` public static void main(String[] args) throws Exception { ```{.java}
for (int i=1; i<999; i++) {
for (int j=i+1; j<999; j++) {
if (i+j+Math.sqrt(i*i + j*j) == 1000)
System.out.print("A:" +i +" " +"B:" +j +" " +"C:" + Math.sqrt(i*i + j*j));
}
}
}
}
Swift입니다.
func findNumber() -> Int {
for a in 1...998 {
for b in a...998 {
let c = 1000 - a - b
if a*a + b*b == c*c {
return a * b * c
}
}
}
return -1
}
print( findNumber() )
def pita():
lipita = []
for n in range(1, 999):
lipita += [sorted([n, x, 1000 - n - x]) for x in range(1, 999)]
for check in lipita:
if check[0]**2 + check[1]**2 == check[2]**2:
return check[0]*check[1]*check[2]
print(pita())
Python 3입니다
Python
n = 1000
for b in range(1, n-1):
if (n**2 - 2 * n * b) % (2 * n - 2 * b) == 0:
a = (n**2 - 2 * n * b) // (2 * n - 2 * b)
c = 1000 - a - b
if 0 < a < b < c:
print(a, b, c, a*b*c)
for i in range(1,500):
for j in range(i,500):
if i+j+(i**2+j**2)**0.5 == 1000:
print(i*j*((i**2+j**2)**0.5))
break
파이썬입니다.
for c in range(1,500):
for a in range(c-1):
for b in range(a-1):
if a**2 + b**2 == c**2 and a+b+c == 1000:
print(a,b,c)
else : pass
c언어
#include<stdio.h>
int main()
{
int i,j,k;
int p1, p2, p3;
int result;
for(i=1; i<1000; i++)
{
p1 = i * i;
for(j=1; j<i; j++)
{
p2 = j * j;
for(k=1; k<j; k++)
{
p3 = k * k;
if((p1 == p2+p3) && (i+j+k == 1000))
{
result = k * j * i;
printf("a =%d b =%d c = %d a2 = %d b2 = %d c2= %d result = %d \n", k, j, i, p3, p2, p1, result);
}
}
}
}
}
for i in range(1, 1000):
for j in range(1, i):
for k in range(1, j):
if pow(k,2)+pow(j,2)==pow(i, 2) and i+j+k == 1000:
print(i*j*k)
for a in range(1,500):
for b in range(a,500):
for c in range(b,500):
if a**2+b**2==c**2:
if a+b+c==1000:
print(a*b*c)
package test;
public class test {
public static void main(String[] args) {
end: for (int i = 1; i < 501; i++)
for (int j = 1; j < 501; j++)
for (int k = 1; k < 501; k++)
if (i + j + k == 1000 && Math.pow(i, 2) + Math.pow(j, 2) == Math.pow(k, 2) && j > i) {
System.out.println(i * j * k);
break end;
}
}
}
for x in range(1,1000):
for y in range(1,1000):
if x<y:
if x*x+y*y==pow(1000-x-y,2):
print(x*y*(1000-x-y))
break
clist = [i**2 for i in range(1000)]
for a in range(1,1000):
for b in range(a+1,1000):
c2 = a**2 + b**2
if c2 in clist:
c = clist.index(c2)
#print(a, b, c)
if a+b+c == 1000:
print("answer is ", a, b, c)
답은 answer is 200 375 425
#include <stdio.h>
int main(void)
{
int a, b, c;
for (c = 1; c < 500; c++)
for (b = 1; b < c; b++)
for (a = 1;a < b; a++) {
if (a*a+b*b==c*c && a+b+c==1000)
printf("%dx%dx%d = %d ", a, b, c, a*b*c);
}
return 0;
}
c언어
result=0
for a in range (1, 500) :
for b in range(2, 500) :
for c in range(3, 500) :
if(a>b) :
break
elif(a+b+c>1000):
break
elif(pow(a,2)+pow(b,2)==pow(c,2)) :
print("a : "+ str(a) +" b: "+ str(b) +" c : "+str(c))
if(a+b+c==1000):
print("chk")
result=a*b*c
break
if(result!=0): break
if(result!=0) : break
print(result)
'''
from random import randint
while 1:
a = randint(1,1000)
b = randint(1,1000)
c = randint(1,1000)
if a < b < c and a**2 + b**2 == c**2 and a + b + c == 1000:
print(a*b*c)
break
'''
for c in range(5, 1000):
for b in range(1, c):
for a in range(1, b):
if a**2 + b**2 == c**2 and a + b + c == 1000:
print(a, b, c, a*b*c)
a1=0
b1=0
c1=0
for a in range(1,500):
for b in range(1,500):
for c in range(1,500):
if a+b+c==1000:
if a**2+b**2==c**2:
a1=a
b1=b
c1=c
print(a1*b1*c1)
for a in range(1, 1000):
for b in range(1, 1000):
c = 1000 - a - b
if a * a + b * b == c * c and a < b < c:
print(a * b * c)
파이썬.
입력받은 3세개의 숫자를 number라는 리스트에 추가시킨 후,
리스트 요소들을 오름차순으로 정렬했을 때,
중간에 위치한 값을 찾았습니다.
number = []
i = 1
while i < 4:
num = int(input("%d번째 숫자를 입력하세요: " % i))
number.append(num)
i = i + 1
number.sort()
mid = int(len(number)/2)
print(number[mid])
#include <stdio.h>
int main(void)
{
int a, b, c;
for(a=1;a<1000;a++)
for (b = 1; b < 1000; b++)
for (c = 1; c < 1000; c++)
if(a*a + b*b == c*c && a+b+c==1000)
printf("%d %d %d %d\n",a,b,c,a*b*c);
return 0;
}
void main()
{
int a, b, c;
for (c = 1;; c++)
{
for (b = 1; b < c; b++)
{
for (a = 1; a < b; a++)
{
if (a + b + c == 1000 && (a * a + b * b == c * c))
printf("%d * %d * %d = %d", a, b, c, a * b * c);
}
}
}
}
for i in range(1,1000) :
for j in range(i, 1000-i) :
if i**2 + j**2 == (1000-i-j)**2 :
print(i*j*(1000-i-j))
break
for a in range(1,1000):
for b in range(a,1000):
for c in range(b,1000):
if a+b+c != 1000: continue
if a**2 + b**2 == c**2: print(a,b,c, a*b*c)
a = 200 b = 375 c = 425 abc = 31875000
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Triplet();
}
static void Triplet()
{
for(int a = 1; a < 1000; a++)
{
for(int b = a + 1; b < 1000; b++)
{
for(int c = b + 1; c < 1000; c++)
{
if (a + b + c == 1000 && a * a + b * b == c * c)
{
Console.WriteLine(a * b * c);
}
}
}
}
}
}
}
for a in range(1, 333):
for b in range(a + 1, 665):
c = 1000 - a - b
if c ** 2 == (a ** 2) + (b ** 2) and a + b > c:
print(a * b * c)
from math import sqrt
def Pytha(n):
for a in range(1,int(n/2)):
for b in range(a,int(n/2)):
c = sqrt(a*a+b*b)
if a+b+c == n:
print(int(a*b*c))
for a in range(1, 500):
for b in range(a, 500):
for c in range(b, 500):
if a*a + b*b == c*c and a + b + c == 1000:
print(a*b*c)
for a in range(1,500):
for b in range(a,500):
for c in range(b,500):
if a**2 + b**2 == c**2 and a + b + c == 1000:
print(a*b*c)
for a in range(1, 500) :
for b in range(a+1, 500) :
for c in range(b+1, 500) :
if a**2 + b**2 == c**2 :
if a + b + c == 1000 :
print(a*b*c)
파이썬입니다..
for a in range(1,500):
for b in range(a,500):
for c in range(b,500):
if (a*a+b*b==c*c) and a<b<c and a+b+c==1000:
print(a*b*c)
for a in range(1,501):
for b in range(a,1001-a):
if a**2+b**2==(1000-a-b)**2:
print(a,b,1000-a-b,a*b*(1000-a-b))
# Sol 1) brutal search
for i in range(100, 1000):
for j in range(i + 1, 1000):
for k in range(j + 1,1000):
if i < j and j < k:
if (i + j + k) == 1000:
if (i**2 + j**2) == k**2:
print('i, j, k: ', i, j, k)
print('i * j * k: ', i * j * k)
# Sol 2) By using mathematical algorithm
# a = m^2 - n^2, b = 2mn c = m^2 + n^2(m > n)
for m in range(2, 1000):
for n in range(1, 1000):
a = m**2 - n**2
b = 2*m*n
c = m**2 + n**2
if (a + b + c == 1000) and \
(a**2 + b**2 == c**2):
if (a > 0 and b > 0) and c > 0:
print("a, b, c: ", a, b, c)
print("a * b * c: ", a * b * c)
for a in range(1,1001):
for b in range(1,1001):
if (a**2+b**2==(1000-a-b)**2) & (a<b):
print(a*b*(1000-a-b)) # 31875000
for a in range(1,500):
for b in range(a+1,500):
for c in range(b+1,500):
if a+b+c==1000 and a*a+b*b==c*c:
print(a*b*c) #31,875,000
exit
3중루프라 시간복잡도가 어마어마할것만 같아서, 원하는 값만 얻고 바로 종료하도록 하였읍니다. 그래도 완전탐색으로 하고 있어서 시간이 많이 걸리기는 하는군요ㅠ
print([a*b*c for a in range(1, 500) for b in range(a, 500) for c in range(b, 500) if a*a+b*b==c*c and a+b+c==1000])
python 3.6
for c in range(334, 500):
for b in range(round(500-c/2), c):
a = 1000 - b - c
if a**2 + b**2 == c**2:
print(a*b*c)
Python 3.6
for a in range(1001): # 피타고라스의 수 중 a를 정하고
for b in range(1001):# 피타고라스의 수 중 b를 정하고
for c in range(1001):# 피타고라스의 수 중 마지막 c를 정하고
if a*a + b*b = c*c:# 피타고라스의 수가 성립하는지 확인하고
if a + b + c = 0: # a + b + c 가 1000 이면
print(a*b*c) # a * b * c 를 출력한다.
Made by GPS
for a in range(1, 500):
for b in range(a, 500):
c = 1000 - (a + b)
if a**2 + b**2 == c**2:
print(a * b * c)
for m in range(1, 1000) :
for n in range(1, m) :
a = m**2 - n**2; b = 2*m*n; c = m**2 + n**2
if a + b + c == 1000 :
print(a * b * c)
import random as rd
Pythagorean = dict(zip(['a','b','c','a*b*c'],[0]*4))
while True:
a = rd.randint(1,1000)
b = rd.randint(1,1000)
c = 1000 - a - b
if a**2 + b**2 == c**2 and a < b < c and a + b > c:
Pythagorean['a'] = a
Pythagorean['b'] = b
Pythagorean['c'] = c
Pythagorean['a*b*c'] = a*b*c
break
print(Pythagorean)
python 3.7
isbreak = 0
for c in range(334, 500): # (a+b+c)/3 < c < a+b
for b in range(c-1, (499-c//2), -1): # (a+b)/2 < b < c
a = 1000 - b - c
if a**2 + b**2 - c**2 == 0:
print(a*b*c)
isbreak = 1
break
if isbreak == 1: break
for a in range(1,500,1):
for b in range(a,500,1):
for c in range(b,500,1):
if a*a+b*b==c*c and a+b+c==1000:
print(a*b*c)
답 : a, b, c = 200,375,425, a b c = 31875000
for(int a = 1; a<1000; a++) {
for(int b=a+1; b<1000; b++) {
for(int c=b+1; c<1000; c++) {
if(a*a + b*b == c*c &&
a+b+c == 1000) {
System.out.println(a+","+b+","+c);
System.out.println(a*b*c);
}
}
}
}
for a in range(1,1001):
for b in range(1,1001-a):
for c in range(1,1001-(a+b)):
if a**2+b**2==c**2 and a+b+c==1000 and a<b<c :
print("a : {}, b : {}, c : {}, a*b*c = {}".format(a,b,c,a*b*c))
for a in range(1,1001):
for b in range(1,1001-a):
for c in range(1,1001-(a+b)):
if a**2+b**2==c**2 and a+b+c==1000 and a<b<c :
print("a : {}, b : {}, c : {}, a*b*c = {}".format(a,b,c,a*b*c))
import math
for a in range(1,500):
for b in range(a+1,500):
c = math.sqrt(a*a + b*b)
if (c.is_integer()) & (a + b + c == 1000) :
print(a)
print(b)
print(c)
print(a*b*c)
for a in range(1, 1000):
for b in range(1, 1000 - a):
c = 1000 - (a + b)
if (a**2 + b**2 == c**2) & (a < b < c):
print(a, b, c)
for a in range(1,500):
for b in range(a,500):
c=a**2+b**2
root_c=c**(1/2)
if a+b+root_c==1000:
print(a,b,root_c,a*b*c)
public class SpecialPythagoreanTriplet {
public static void main(String[] args) {
for(int i = 1; i<999; i++) {
for(int j=1; j<1000-i; j++) {
for(int k=1; k<=1000-i-j; k++) {
if(i+j+k==1000) {
if(i*i + j*j == k*k) {
System.out.println(i*j*k);
}
}
}
}
}
}
}
파이썬 3.7
for a in range(1,1000):
for b in range(1,1000-a):
c=1000-(a+b)
if (a*a+b*b==c*c) & (a<b<c):
print(a,b,c)
print(a*b*c)
for i in range(1, 1000):
for j in range(i + 1, 1000):
for k in range(j + 1, 1000):
print('a : %d, b : %d, c : %d' % (i, j, k))
if i + j + k == 1000 and (k ** 2) == (i ** 2) + (j ** 2):
print('a x b x c : ' + str(i * j * k))
break
Python 으로 작성했는데, 뭔가 지극히 비효율적인 코드인 것 같습니다....
파이썬입니다.
for a in range(1, 500):
for b in range(a, 500):
for c in range(b, 500):
if (a**2 + b**2) == (c**2) and a+b+c == 1000:
print('a*b*c: {}\na: {}, b: {}, c: {}, '.format(a*b*c,a,b,c))
for a in range(1,333):
for b in range(a,500):
for c in range(b,500):
if a+b+c==1000:
if a**2+b**2==c**2:
print(a,b,c)
print(a*b*c)
파이썬 3입니다. 적절한 범위 내에서 피타고라스 정리를 만족하는 값을 찾았습니다.
# x를 빗변으로, y는 가장 짧은 변으로 둔다
for x in range(334, 500): # x는 가장 긴 변이고 삼각부등식 만족
for y in range(1, (1000-x)//2): # y는 가장 짧은 변
if x**2 - y**2 == (1000-x-y)**2:
print(x*y*(1000-x-y))
for a in range(1, 1000):
for b in range(1, 1000):
for c in range(1, 1000):
if a + b + c == 1000 and (a**2)+(b**2)==(c**2):
print(a*b*c)
public class Pythagorean {
public static void main(String[] args) {
int a,b,c ;
for(c=1;c<1000; c++) {
for(b=1; b<c; b++) {
for(a=1; a<b; a++) {
if((a+b+c == 1000) && (c*c==(a*a) + (b*b))){
System.out.println("a는 "+a);
System.out.println("b는 "+b);
System.out.println("c는 "+c);
System.out.println("a X b X c ="+(a*b*c));
}
}
}
}
}
}
for a in range(1,1001):
for b in range(1,1001):
c = 1000 - (a+b)
if int(a**2) + int(b**2) == c**2 and (a<b<c):
print (a*b*c)
else: continue
for a in range (1,1000):
for b in range (a+1,1000-a):
c=1000-a-b
if a**2+b**2==c**2:
if a<b and b<c:
print (a,b,c)
print (a*b*c)
def pytr(n):
result=[]
for a in range(1, round(n/2)-1):
for b in range(1, n-a):
if a**2+b**2==(n-b-a)**2:
result.append(a*b*(n-b-a))
if result==[]:
return "No integer solution."
return list(set(result))
print(pytr(1000))
a+b+c=n 과 a^2+b^2=c^2를 만족하는 정수 a, b, c의 곱 a * b * c를 모두 구하는 프로그램입니다.
#Python
for a in range(1000):
for b in range(1000):
for c in range(1000):
if (a**2+b**2==c**2) and (a<b<c) and (a+b+c==1000):
print(f'a: {a}, b: {b}, c: {c}, Product: {a*b*c}')
#Answer: a: 200, b: 375, c: 425, Product: 31875000
for i in range(1,500):
for j in range(1,500):
k = (i**2 + j**2)**0.5
if k - int(k) == 0:
if i + j + k == 1000:
print(int(i*j*k))
break
for a in range(1, 1000):
for b in range(a+1, 1000):
c = 1000 - b - a
if c > b > a:
if c == pow(pow(a, 2) + pow(b, 2), 0.5):
print(a, b, c, a*b*c)
for a in range(500):
for b in range(500):
if a+b+((a**2 + b**2)**0.5)==1000 and ((a**2 + b**2)**0.5)>a and b>a :
print(int(a*b*((a**2 + b**2)**0.5)))
else:
pass
for n in range(1000):
n=n+1
for m in range(1000):
m=m+1
for o in range(1000):
o=o+1
if n*n+m*m == o*o:
if n+m+o ==1000:
print(n,m,o)
else:
pass
else:
pass
int _tmain(int argc, _TCHAR* argv[])
{
cout << "hello wordl" << endl;
int nA, nB, nC;
int nFin = 0;
int nStart = GetTickCount();
for(nC = 0 ; nC < 997 ; nC++)
{
for(nB = 0 ; nB < nC ; nB++)
{
for(nA = 0 ; nA < nC ; nA++)
{
if(nA >= nB)
break;
if((nA + nB + nC) == 1000)
{
if( ((nA*nA) + (nB*nB)) == (nC*nC) )
{
nFin = nA*nB*nC;
goto finished;
}
}
}
}
}
finished:
int nStop = GetTickCount();
int a = nStop - nStart;
return 0;
}
public class Q131 {
public static void main(String[] args) {
for (int c = 0; c < 1000; c++) {
for (int b = 0; b < 1000; b++) {
for (int a = 0; a < 1000; a++) {
if (a * a + b * b == c * c && a + b + c == 1000 && a < b && b < c) {
System.out.println(a * b * c);
}
}
}
}
}
}
for a in range(1,1001):
for b in range(a, 1001):
for c in range(b, 1001):
if a**2 + b**2 == c**2:
if a+b+c == 1000:
print (a*b*c)
break
컴퓨터가 너무 아파해요.... ㅠㅠ
for a in range(1,500):
for b in range(1,500):
for c in range(1,500):
if a*a+b*b == c*c:
if a+b+c == 1000:
print(a*b*c)
작업시간이 오래걸리지만 답은 나옵니당,,,ㅎㅎ
total_break=True
for i in range(1,333) :
for j in range(2,1000):
for k in range(3,1001):
if i*i+j*j==k*k and i<j and j<k and i+j+k==1000:
print('%d %d %d' %(i,j,k))
total_break=False
break
if total_break==False :
break
if total_break==False :
break
반대로 구햇으면 더빨리 계산됐을것같네요
for c in range(1,1000):
for b in range(1,500):
for a in range(1,334):
if a > b or a > c or b > c:
break
if a+b+c == 1000 and a**2 + b**2 == c**2:
print("a는 {} b는 {} c는{}".format(a,b,c))
print(a*b*c)
package Lv_1;
public class special_Pythagorean_Triplet {
int ans;
public void check() {
for(int i=1; i<1000; i++) {
for(int j=1; j<1000; j++) {
for(int k=1; k<1000; k++) {
if((i*i)+(j*j)==(k*k)) {
if((i+j+k)==1000)
ans = i*j*k;
}
}
}
}
}
public static void main(String args[]) {
special_Pythagorean_Triplet spt = new special_Pythagorean_Triplet();
spt.check();
System.out.println(spt.ans);
}
}
#include <stdio.h>
int main(){
int a,b,c,result;
for(c=1;c<500;c++)
{
for(b=1;b<c;b++)
{
for(a=1;a<b;a++)
{
if(c*c==b*b+a*a && a+b+c==1000)
{
result=a*b*c;
printf("%d",result);
}
}
}
}
return 0;
}
static void pytha(int number) {
for(int i=1; i<number; i++) {
for(int j=1; j<number; j++) {
for(int t=1; t<number; t++) {
if(i*i + j*j==t*t && i<j && i+j+t==number) {
System.out.printf("%d %d %d\n", i, j, t);
System.out.println(i*j*t);
}
}
}
}
}
public static void main(String[] args) {
pytha(1000);
}
from itertools import combinations
class PitaFinder:
def __init__(self):
self.list = []
self.comb = []
def makeList(self):
for i in range(1,501):
self.list.append(i)
def findPita(self):
self.comb = list(combinations(self.list,3))
for i in self.comb:
if i[0]+i[1]+i[2]==1000 and i[0]**2+i[1]**2==i[2]**2:
print (i,i[0]*i[1]*i[2])
a = PitaFinder()
a.makeList()
a.findPita()
package dojang;
public class Pythagoreantriplet {
public static void main(String[] args) {
for(int a=1;a<1000;a++) {
for(int b=a+1;b<1000;b++ ) {
for(int c=b+1;c<1000;c++) {
if(a+b+c==1000&&(a*a)+(b*b)==c*c) {
System.out.println(a*b*c);
}
}
}
}
}
}
num = 500
result = []
for a in range(1, num):
for b in range(1,num):
for c in range(1, num):
if (a < b < c) and (c**2 == a**2 + b**2) :
if sum([a,b,c]) == 1000:
result.append([a,b,c])
print(result)
for i in range(1,999,1):
for j in range(i+1,1000,1):
for l in range(j+1,1001,1):
if i+j+l==1000 and (i*i+j*j==l*l):
print("{0}, {1}, {2} is foude".format(i,j,l))
[(a,b,c) for a in range(1,996) for b in range(a+1,997) for c in range(b+1,998) if a+b+c ==1000 and a**2+b**2 ==c**2]
c=5
k="false"
while(1):
for a in range(1,c):
for b in range(a+1,c):
if b == ( (c**2)-(a**2) )**(1/2) and a+b+c==1000:
print(a*b*c)
k="true"
break
c+=1
if k=="true":
break
for a in range(1, 1001):
for b in range(a + 1, 1001):
c = 1000 - a - b
if c <= 0:
break
if a ** 2 + b ** 2 == c ** 2:
print("a = {}, b = {}, c = {}".format(a, b, c))
for i in range(1, 334):
for j in range(i + 2, 999 - 2 * i):
if j*j - i*i == pow(1000 - i - j, 2):
a = i
b = 1000 - i - j
c = j
break
print(a, b, c)#200, 375, 425
print(a*b*c)
python 3.9.1
break_point = True
for c in range(500, 0, -1):
for b in range(1000-c,int((1000-c)/2), -1):
for a in range(1000-c-b, 0, -1):
if a + b + c == 1000 and (a*a + b*b) == c*c:
print(a*b*c)
break_point = False
break
if break_point == False :
break
if break_point == False :
break
for i in range(1,500):
for k in range(1, 500):
for j in range(1, 500):
if i < k < j and i ** 2 + k ** 2 == j ** 2:
if i + k + j == 1000:
print(i,k,j)
print(i*k*j)
break
for c in range(1,1000):
for b in range(1,c):
for a in range(1,b):
if a**2 + b**2 == c**2 and a+b+c == 1000:
print(a*b*c)
for a in range(1,500):
for b in range(1,500):
for c in range(1,500):
if a**2 + b**2 == c**2 :
if a + b + c == 1000:
print(a*b*c)
문제는 쉬운데 반복문이 많다보니 연산 시간이 오래 걸리네요. 범위를 잘 정하는것도 중요하지 싶습니다.
for a in range(1, 500):
for b in range(a+1, 500):
c = 1000-a-b
if a**2 + b**2 == c**2:
print(a, b, c, ':', a*b*c)
exit()
처음엔 3개의 for문을 사용했는데 윗분 말씀처럼 1000을 범위로 하여 3개의 for문을 사용하면 계산시간이 많이 걸립니다 그래서 for문을 줄이고 각변의 범위값을 줄이고 값은 하나만 있으니 발견하면 프로그램을 바로 종료하게 하였습니다 첫번째 답인 예강효빠님의 범위계산 방법을 보고 아....나도 문제를 보고 이분처럼 생각하고 접근하면 좋겠다는 생각했답니다
Python입니다.
>>> def pythagorean_number(a, b, c):
... return a**2 + b**2 == c**2
...
>>> pythagorean_number(3, 4, 5)
True
>>> def f():
... for a in range(1, 500):
... for b in range(a + 1, 500):
... c = 1000 - (a + b)
... if pythagorean_number(a, b, c):
... return a * b * c
...
>>> f()
31875000
range() 범위
a:
a, b, c는 삼각형의 세 변의 길이에 해당하므로 b + c > a이고 문제에서 b + c = 1000 - a이므로 a < 500
b:
문제에서 a < b이므로 b는 a + 1부터 시작 (https://codingdojang.com/scode/545?answer=7448#answer_7448 참고함)
끝 범위는 a와 마찬가지로 b < 500
c:
a + b + c = 1000이므로 루프 필요 없이 c = 1000 - (a + b)
(https://codingdojang.com/scode/545?answer=25052#answer_25052 참고함)
for a in range(1,500):
for b in range(a,500):
c= 1000-a-b
if a*a+b*b==c*c:
print(a*b*c)
print(a,b,c)
사실 처음에는 범위 지정해야한다는 생각도 못했는데 풀이를 보고 많이 배웠네요. 계산의 효율성을 어떻게 높일 수 있는지 고민하게 해주는 문제인 것 같습니다.
for a in range(1,500):
for b in range(1,500):
for c in range(1,500):
if a**2+b**2==c**2 and a+b+c == 1000 and a<b<c:
print(a*b*c)
def fuc():
for a in range(1, 1001):
for b in range(1, 1001):
c =1000 - b - a
if (a ** 2) + (b ** 2) == c ** 2 and b > a:
return a * b * c
print(fuc())
#codingdojing_special pythagorean triplet
# a = 1000 - b -c
# a + b > c 이므로, c는 500 미만의 값
# a**2 + b** 2 = c**2
# a < b < c
resultList = []
for c in range(1, 500): #1~500
for a in range(1, 1001-c): #a+b는 고정 c = 1000-(a+b)
b = 1000 - a- c #a< b< c
if a < b and a**2 + b**2 == c**2:
resultList.append((a,b,c))
print(a*b*c)
print(resultList) #[(200, 375, 425)]
# a = 200, b = 375, c = 425
# abc = 31875000
파이썬 3.8.10으로 작성되었습니다. 그냥 단순 무식하게 찾을 때까지 모든 경우의 수를 다 돌려 봤습니다. 대략 20만번 쯤 반복한 후에 결과값이 나옵니다. (375, 200, 425)가 정답입니다.
import random
def choice():
list_sample = list(range(0, 1000))
a = random.choice(list_sample)
b = random.choice(range(0, 1000 - a))
c = 1000 - a - b
return (a, b, c)
def is_pitagoras(val):
a, b, c = val
return a**2 + b**2 != c**2
def main():
global value
value = choice()
i = 0
while is_pitagoras(value):
value = choice()
i += 1
print(value)
if __name__ == '__main__':
main()
for c in range(1, 500):
for b in range(1, c-1):
for a in range(1, b-1):
if (a*a)+(b*b) == c*c and a+b+c == 1000:
print(a*b*c)
break
for c in range(334,500) :
for a in range(1,250):
b = 1000 - a -c
if a**2 + b**2 == c**2:
print(a*b*c)
for a in range(1,500):
for b in range(a+1,500):
if a**2 + b**2 == (1000-a-b)**2:
print(a,b,1000-a-b)
print(a*b*(1000-a-b))
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
for (int k = 0; k < 1000; k++) {
if (i + j + k == 1000 && (i * i) + (j * j) == (k * k) && ((i < j && j < k))) {
System.out.println(i + " " + j + " " + k);
System.out.println(i * j * k);
}
}
}
}
}
import math
for a in range(1,1000) :
for b in range(a+1,1000) :
for c in range(a+2,1000) :
if a**2+b**2==c**2 and a+b+c == 1000 :
print(a,b,c)
for a in range (1000):
for b in range(a+1,1000):
for c in range(b+1,1000):
if a*a+b*b-c*c == 0 and a+b+c ==1000:
print(a*b*c)
// Rust // a + b + c = limit, a < b < c 조건을 활용하면 a^2+b^2==c^2를 검사할 때 loop횟수를 줄일수 있습니다 // a가 갈 수 있는 최대값은 limit/3 - 1 (integer division은 반내림, limit이 3으로 나누어지든 않든 마찬가지) // b가 갈 수 있는 범위는 a+1부터, (limit-a)/2가 2로 나누어지면 (limit-a)/2-1, 나누어지지 않으면 (limit-a)/2까지입니다 // 이렇게 루프를 돌리면 c = limit - a - b는 항상 c > b > a를 만족합니다
fn main() {
let limit: u32 = 1000;
if let Some((a, b, c)) = pythagorean_triplet(limit) {
println!("{} x {} x {} => {}", a, b, c, a * b * c);
}
}
fn pythagorean_triplet(limit: u32) -> Option<(u32, u32, u32)> {
// integer division rounds down to the nearest integer
for a in 1..(limit/3) {
let b_limit = (limit - a) / 2 + if (limit - a) % 2 == 0 {
0 } else {
1 };
for b in (a+1)..b_limit {
if a.pow(2) + b.pow(2) == (limit - a - b).pow(2) {
return Some((a, b, limit-a-b));
}
}
}
None
}
#Special Pythagorean triplet
for a in range(1, 1000):
for b in range(1, 1000):
for c in range(1, 1000):
if a * a + b * b == c * c and a < b < c and a + b + c == 1000:
print(a*b*c)
for a in range(100,500):
for b in range(a,500):
for c in range(b,500):
if a+b+c==1000:
if a**2+b**2==c**2:
print(a*b*c)
using System;
using System.Collections.Generic;
namespace FirstProgram
{
class Program
{
static void Main(string[] args)
{
int result = 0;
for(int i=1; i<500; i++)
{
for(int j=1; j<500; j++)
{
for(int k=1; k<500; k++)
{
if(i + j + k == 1000 && i*i + j*j == k*k)
{
result = i * j * k;
}
}
}
}
Console.WriteLine(result);
}
}
}
C#
def pytha(a,b,c):
if a < b < c:
return True if a**2 + b**2 == c**2 else False
for a in range (1,500):
for b in range(1,500):
c = 1000-a-b
if a + b + c == 1000:
if pytha(a,b,c):
print(a*b*c)
package com.algorithm.algorithmpractice.dojang;
public class Oiler {
public static void main(String[] args) {
for(int a = 0; a < 500; a++){
for(int b = 0; b < 500; b++){
for(int c = 0; c < 500; c++){
if(a+b+c == 1000 && Math.pow(a, 2) + Math.pow(b, 2) == Math.pow(c, 2)){
System.out.println(a * b * c);
break;
}
}
}
}
}
}
고등학교 수학으로 푸려고했는데 까먹어서 도저히 그렇게 풀수가 없어서 컴퓨터 갈굼.
k=[]
for a in range(1,334):
b=a
while (1000-a-b)>b:
if a**2+b**2==(1000-a-b)**2:
k.append(a)
k.append(b)
k.append(1000-a-b)
break
b+=1
print(k)
print(200*375*425)
31875000이 나오네요
for a in range(1, 34):
for b in range(a, 34):
for c in range(b, 34):
if c*c == a*a + b*b & c*c + b*b + a*a == 1000:
print(a, b, c)
python
def pytha():
for a in range(1,1000):
for b in range(a,1000):
for c in range(b,1000):
if a**2 + b**2 == c**2 and a + b + c == 1000:
return(a*b*c) #return과 동시에 함수가 종료되므로 다중 반복문 탈출
print(pytha())
해당인자값이 반복될때, 뒤의 숫자는 앞의 숫자의 +1부터 시작임. 때문에 뒤의 숫자가 항상 클 수 밖에 없음.
private static int pythagoras() {
int num1=0; int num2=0; int num3=0; for(int i=1; i<1000; i++) { for(int j=i+1; j<1000; j++) { for(int k=j+1; k<1000; k++) { if(i*i+j*j == k*k && i+j+k == 1000) { num1 = i; num2 = j; num3 = k; } } } } System.out.println("num1:" + num1 + " " + "num2:" + num2 + " " + "num3:" + num3); return num1*num2*num3;}
for a in range(1000) :
for b in range(1000) :
for c in range(1000) :
if a + b + c == 1000 and a**2 + b**2 == c**2 :
print(a*b*c)
31875000
for a in range(1,1000):
for b in range(1,1000):
c = 1000 - a - b
if a**2 + b**2 == c**2 and a < b < c:
print(a,b,c,a+b+c,a*b*c)
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
for (int a = 1; a < 334; a++)
{
for (int b = 501-a; b < 500; b++)
{
int c = 1000 - a - b;
if(c >= b && a*a + b*b == c*c)
Console.WriteLine("{0}, {1}, {2}, {3}",a,b,c,a*b*c);
}
}
}
}
}
def pitagoras() :
results = []
for c in range(1,1000):
for b in range(1,999):
a = 1000 - b - c
if a**2 + b**2 == c**2 :
return f"a:{a},b:{b},c:{c}, a x b x c = {a*b*c:,}"