물어볼 친구가 없엉
아래 알고리즘 계산량을 줄이는 방법을 찾아오라는데 아무리 대가리를 굴려봐도 어떻게 해야할지 모르겠어 이거 while문 써야하는거야?
#include <stdio.h>
int main(void)
{
int a = 0, b = 0, c = 0;
printf(" a b c \n");
for (a = 1; a <= 100; a++)
{
for (b = 1; b <= 100; b++)
{
for (c = 1; c <= 100; c++)
{
if ((a*a) + (b*b) == (c*c) )
{
printf("%2d %2d %2d\n", a, b, c);
}
}
}
}
return 0;
}
a*a을 b와 c가 변할 때마다 다시 계산해야할 필요성이 있을까?
a, b, c 위치를 바꿔봐
그냥 a제곱 더하기 b제곱이 100이하일때 출력하면 c반복문 100번 돌필요 없잖아 - dc Cpp
c반복문에서 if문 히트하는 경우의 수가 단 하나뿐인데 - dc Cpp
굳이 c를 for문 돌려가면서 찾아야 할까?
문제 자체는 "a^2+b^2 = c^2"인 (a,b,c) triplet을 찾는건데 (피타고라스의 수), 저런 문제의 의도는, for문은 그대로 두고 계산량을 줄이라는거지, 무슨 수학적으로 더 나은걸 찾으라는 뜻이 아니지 (a제곱 더하기 b제곱이 100이하일때 어쩌고 같은 개소리는 하지 말라는 뜻).
저기서 "계산량" 이라고 할만한 거는 a*a, b*b, c*c이고, 따라서 이를 줄이는데 집중해야하는데, 일단 a*a를 보면 이게 쓸데없이 계속 계산된다는 것을 알 수 있음. a는 b와 c에 의존하는 값이 아닌데, 왜 for(b)랑 for(c)안에 있냐? 따라서 a*a를 그 두 개의 for문 밖으로 빼내란 소리야.
즉, 원래 코드는 각 a값에 대해 a*a가 10000번씩 계산되는데 (b=100개, c=100개, 곱하면 만개), a를 밖으로 빼서 for(a) 안에 넣으면 a*a는 100번밖에 계산 안됨 (a=100개). 마찬가지로 b*b도 밖으로 끄집어 내고.
그게 아마도 학교 선생님(교수님?)께서 의도했던걸거고. 저기가 더 추가하고 싶으면, a*a+b*b<c*c가 되는 순간 break로 for(c)에서 벗어나게 하면 되고 (이런게 약간 수학적인거란 얘기임. 선생님 의도는 아닐거란 얘기). 더 빡시게 하고 싶으면 아예 초반에 배열 101개 arr[101] 잡고, arr[i] = i*i 를 미리 계산해놓으면 굳이 a*a, b*b, c*c 계산할 필요 없이 배열 접근으로 가능함. 설마 이런거까지 선생님께서 의도하셨으리라곤 생각치 않음.
근데 솔직히 이런 질문할 빡대가리라면 학교 (학원?) 수업을 아예 안들은듯.
고마워요 형
내가 이런 숙제같은 글에는 왠만하면 답변을 안 하는데, 댓글단 새끼들 수준을 보니 좆한심해서 내 답글을 달았다. 여기서 도움을 구하지 말고 가서 수업을 열심히 듣고 공부를 해.
넵