2014-12-18 6 views
-2

나는 사용자가 3 개의 숫자 인 a, b, c을 입력하는 작업을 해결하고 있었다. 목표는 cab의 합계를 얻을 수 있는지 확인하는 것입니다. 각 단계에서 ab에 추가하고 ba에 추가 할 수 있습니다. 입력 한 숫자로 가능한지 알아야합니다. 입력 한 숫자는 010^18 사이입니다. 아래는 재귀를 사용하여 작성한 코드입니다. a=4 b=6 c=38에 대한 작업을 해결재귀를 사용하는 C 프로그램은 최적화되고 고정 될 필요가있다.

예 :

  1. a=4 b=10
  2. a=14 b=10
  3. a=14 b=24
  4. a=38 b=24 print YES

내 아래 코드는하지만 낮은 숫자 아니라 그 일을 내가 생각하는 나는 더 큰 것을 가진 전투를 잃고있다. 숫자 ... 나는 어떤 부분이 무엇을하고 있는지에 대한 몇 가지 코멘트를 덧붙였다.

도움이 필요한 것은 더 잘 작동하고 더 빨리 작동해야하며 더 최적화하는 방법을 알지 못합니다.

//the function that I'm using 
int task(long long int a, long long int b, long long int c, long long int d, int p) 
{ //a, b and c are long long integers that are submited by the user, d is the sum of 
    //the unchanged a and b, and p is a flag 
    if(!a && !b && c) return 0; //0+0 will never get to 1 
    if(c==d) return 1; //if I get with c to d, it is confirmed yes, 
         //did the math with a pen :) 
    if(c<d || c<=0) // I thought this is a nice case to stop 
    { 
     return 0; 
    } 
    if(p==1) 
    { 
     if(a>c) return 0; //if the flag p is one, that means i changed a, 
          //so compare a 
    } 
    if(p==2) 
    { 
     if(b>c) return 0; //if p is two, i changed b so compare b 
    } 
    if(c-d>0) return task(a+b, b, c-b, d, 1)||task(a, b+a, c-a, d, 2); 
      //recursion call with OR operator so every step is checked 

}//one part is a=a+b b=b c=c-b, i decrement c so fewer steps are needed, 
//the other part is when i add a to b 

int main() 
{ 
    long long int a,b,c; 
    scanf("%I64d%I64d%I64d",&a,&b,&c); //scaning 
    int p; //the flag for the first numbers 
    if(a>b) p=1; //i dont know if i need this step at all xD 
    else p=2; //but to make sure 
    if((a==1 || b==1) && c) printf("YES"); //a=1 b=1 and c>=1 means i can get to c, 
              //even with a+b+b+b.. 
    else if(a==c || b==c) printf("YES"); //if one of the numbers are already same 
             //with c, no need to check 
    else if(task(a,b,c,a+b,p)) printf("YES"); //if the function returns 1, print YES 
    else printf("NO"); //or print NO 


    return 0; 
} 
+2

알고리즘 개선에 더 집중할 것입니다. 아마도 반복문 대신 반복문으로 바꾸는 데 사용할 수있는 숫자 이론 원리가있을 것 같습니다. 동적 프로그래밍 (Dynamic Programming)을 요구할 수도 있습니다. – Daniel

+0

@ 갤 러니 닉 a와 b의 배수가있는 c를 찾을 수 있습니까? 아니면 c가 a, b, a + b, a + a + b, a + a + b + b, a + a + a + b + b 등? –

+0

@George Houpis, 아니오 n x a + m x b가 아닙니다.이 질문은 최근에 트리 재귀로 요청되었지만 아직 찾을 수 없습니다. –

답변

-1

아마이 문제를 올바르게 이해하지 못하고 있지만 여기에는 두 가지 다른 반복 접근법이 있습니다. 아마도 이것은 당신을 따라 도울 수 있습니다 :

#include <stdio.h> 

int old_task(long a, long b, long c) 
{ 
    size_t iteration; 
    long left = a, right = b; 
    for(iteration = 0; (left < c) && (right < c); ++iteration) 
    { 
     printf("NOT %ld: %ld, %ld < %ld\n", iteration, left, right, c); 
     if(iteration % 2) 
     left += right; 
     else 
     right += left; 
    } 
    printf("STOP %ld: %ld, %ld < %ld\n", iteration, left, right, c); 
    return ((left == c) || (right == c)) ? 1 : 0; 
} 

int task(long a, long b, long c) 
{ 
    long f; 
    /*long i = 0;*/ 
    for(f = a; f < c; f+= a) 
    { 
     /*printf("Checking: %li * %li + %li * %li == %li\n", a, ++i, b, (c - f)/b, c);*/ 
     if((c - f) % b == 0) 
      return 1; 
    } 
    return 0; 
} 

int main() 
{ 
    long a,b,c; 
    scanf("%ld %ld %ld",&a,&b,&c); //scaning 

    printf("%s\n\n", task(a, b, c) ? "YES" : "NO"); 
    return 0; 
} 
+0

왜 -1일까요? 설명 해주십시오. –

+0

나는 위의 설명에서 설명했다. –

+0

"도움이 필요한 것은 더 잘 작동하고 더 빨리 작동해야하며 더 최적화하는 방법을 알지 못합니다." 어떻게 명시 적으로 최적화를 요구하는지. 나는 그것이 비록 투표를 정당화 할 것이라고 생각하지는 않았다 ... –

-1

선형 대수학으로 풀 수 있다고 생각합니다. 의 당신이있어 말을하자 = 3, B = 4, C = 15 그래서 당신이 찾고있는 무엇을

3x + 4y = 15 
x = (15-4y)/3 
그래서

당신이 3으로 분할하는 경우가 더 나머지 부분이 없어야합니다. 15-4y는 모듈로 3이어야하므로 선형 대수학이 온다고 생각합니다.

그냥 생각입니다.

+1

이것이 거짓 긍정 응답을 반환 할 수 있다고 생각합니다. – hatchet

+0

하지만 당신도 그 사람들에게 줄 것이라고 부인하지 않습니까? –

+0

아니요. 나는 그것을 부정하지 않습니다. 그러나 진실을 말하면서도 올바른 것을 줄 것입니다. 나는 완전한 대답이 사실이라면, 그리고 언제나 실제적인 대답이 사실 일 때만 진실이라고 말한다. – hatchet

0

내 아래 코드는 그렇지 않은 낮은 숫자

잘 그것의 일을한다. 입력 2 2 3을 입력하십시오. 가장 명백한 오류는 다음과 같습니다

 
In function 'main': 
warning: format '%I64d' expects type 'int *', but argument 2 has type 'long long int *' 
warning: format '%I64d' expects type 'int *', but argument 3 has type 'long long int *' 
warning: format '%I64d' expects type 'int *', but argument 4 has type 'long long int *' 

이 그것을 수정 %Ld%I64d를 교체하려면.

하지만 난 더 큰 숫자와 전투를 잃어버린 것 같아 ...

물론

스택 오버 플로우를 만들 수있는 재귀 솔루션; 스택 공간이 덜 필요한 프로그램에 대해서는 this answer을 참조하십시오.