2014-10-01 6 views
3

나는 사용자가 입력 한 정수보다 작은 "c"값 (c는 빗변)이있는 모든 피타고라스의 트리플을 찾아야합니다. 나는 이것을 할 수 있었지만, 어떤 트리플이 "c"의 가장 큰 값을 가지고 있는지도 출력해야한다.가장 큰 빗변으로 피타고라스 트리플을 인쇄하는 법

# include <stdio.h> 

int main() 
{ 
    int i=1, N, a, b, c; 

    printf("Please enter an integer number: "); 
    scanf("%d", &N); 

    for(c=1; c<N; c++) 
    { 
     for(b=1; b<c; b++) 
     { 
      for(a=1; a<b; a++) 
      { 
       if((a*a)+(b*b)==(c*c)) 
       { 
        printf("\n%d.(%d,%d,%d)\n", i++, a, b, c); 
       } 
      } 
     } 
    } 

    printf("\nThere are %d triples which contain a c<N.\n\n", (i++)-1); 

    system("PAUSE"); 
    return(0); 
} 
+0

위의 코드 중 어떤 부분이 작동하지 않습니까? 구체적으로 말하십시오. –

+0

마지막'printf' 문에는'i ++'가 필요 없습니다. 'i' 만 사용하십시오. 이 문장 다음에'i'의 값을 사용하지 않으면 코드에 아무런 영향을 미치지 않을 것입니다. 그러면 읽기가 더 어려워집니다. –

+0

코드가 잘 작동합니다. 코드 끝 부분에서 "c의 가장 큰 값을 가진 트리플이 (?,?,?) 인 문장을 인쇄하는 방법을 모르겠습니다. 피할 때 가장 큰 pythagorean 트리플을 얻고 깨끗한 문장으로 끝까지 출력하는 방법을 알고있다. – the1whoknocks

답변

2

가장 큰 c를 기억하도록 변수를 사용할 수 있습니다. ,

int largest_c = 0; //define it 
for(c=1; c<N; c++) 
{ 
    for(b=1; b<c; b++) 
    { 
     for(a=1; a<b; a++) 
     { 
      if((a*a)+(b*b)==(c*c)) 
      { 
       if (c > largest_c) { //found a bigger one, so remember it 
        largest_c = c; 
       } 
       printf("\n%d.(%d,%d,%d)\n", i++, a, b, c); 
      } 
     } 
    } 
} 

그런데 작은 트릭으로, 쉽게 알고리즘을 속도를 높일 수 있습니다 : 다음은 주석 라인을 살펴, 추가 된 시간, 당신은 발견^2 + B^2> = C^2, 즉시 가장 안쪽 루프에 대한 나머지를 건너 뛸 수 있습니다. 알고리즘을 더 빠르게 진행하기 위해 할 수있는 다른 일이 있습니다.

+0

좋아, 고마워 !! 가장 큰 "a"와 가장 큰 "b"에 대해 동일한 원칙이 있습니까? 나는 마지막에 가장 큰 c를 포함하는 전체 트리플을 인쇄하고 싶습니다! – the1whoknocks

+0

감사합니다! – the1whoknocks

+0

굉장히 재미 있어요! –