2013-02-08 6 views
1

연습의 목적으로 가장 기본적인 산술 연산을 사용하여 지수 함수를 구현해야합니다. 나는 X는베이스와 곳이, 해낸 Y 지수 :기본 산술 연산을 사용하여 지수 함수 구현

function expAetB() { 
    product=1; 
    for (i=0; i<y; i++) 
    { 
      product=product*x; 
    } 
    return product; 
}; 

그러나, product=product*x;보다 더 기본적인 작업이 있습니다. 어떻게 든 대신 for 루프를 곱하면 결과를 전달할 수 있어야하지만 무한 루프에 빠지지 않고이를 수행 할 수있는 방법을 찾을 수 없습니다.

+0

이 사이트에서 본 최악의 타이틀 중 하나였습니다. 제목을 어떻게 다시 작성했는지 확인하십시오. –

답변

2

마찬가지로 지수법은 반복 곱하기이므로 곱셈은 단순히 반복됩니다.

또 다른 기능 mulAetB을 작성하면 부정 입력과 같은 것을주의해야합니다.

수준을 한 단계 더 높이고 증가분과 감소분으로 더하기를 정의 할 수 있지만 잔인 할 수 있습니다.


참조, 예를 들어, 부가의 과잉 방법을 사용하여 다음 프로그램 :

#include <stdio.h> 

static unsigned int add (unsigned int a, unsigned int b) { 
    unsigned int result = a; 
    while (b-- != 0) result++; 
    return result; 
} 

static unsigned int mul (unsigned int a, unsigned int b) { 
    unsigned int result = 0; 
    while (b-- != 0) result = add (result, a); 
    return result; 
} 

static unsigned int pwr (unsigned int a, unsigned int b) { 
    unsigned int result = 1; 
    while (b-- != 0) result = mul (result, a); 
    return result; 
} 

int main (void) { 
    int test[] = {0,5, 1,9, 2,4, 3,5, 7,2, -1}, *ip = test; 
    while (*ip != -1) { 
     printf ("%d + %d = %3d\n" , *ip, *(ip+1), add (*ip, *(ip+1))); 
     printf ("%d x %d = %3d\n" , *ip, *(ip+1), mul (*ip, *(ip+1))); 
     printf ("%d^%d = %3d\n\n", *ip, *(ip+1), pwr (*ip, *(ip+1))); 
     ip += 2; 
    } 
    return 0; 
} 

이 프로그램의 출력을 표시하고 계산 올바른지 :

0 + 5 = 5 
0 x 5 = 0 
0^5 = 0 

1 + 9 = 10 
1 x 9 = 9 
1^9 = 1 

2 + 4 = 6 
2 x 4 = 8 
2^4 = 16 

3 + 5 = 8 
3 x 5 = 15 
3^5 = 243 

7 + 2 = 9 
7 x 2 = 14 
7^2 = 49 

정말로 의 경우에 단일 기능이 있어야합니다. 함수 호출을 인라인으로 리팩터링하는 것은 간단합니다.

static unsigned int pwr (unsigned int a, unsigned int b) { 
    unsigned int xres, xa, result = 1; 

    // Catch common cases, simplifies rest of function (a>1, b>0) 

    if (b == 0) return 1; 
    if (a == 0) return 0; 
    if (a == 1) return 1; 

    // Do power as repeated multiplication. 

    result = a; 
    while (--b != 0) { 
     // Do multiplication as repeated addition. 

     xres = result; 
     xa = a; 
     while (--xa != 0) 
      result = result + xres; 
    } 

    return result; 
} 
+0

감사합니다. 그러나 두 번째 기능을 만드는 것은 너무 많은 지름길입니다. 이상적으로는 일련의 겹쳐진 루프 만 사용하고 product = product * x와 같은 바로 가기는 사용하지 말아야합니다. – user2052971

+0

@ user2052971, 이전 댓글에서 요청한 것과 같은 고의적 인 질문은 미래의 방문자를 도울 가능성이 매우 낮습니다 (따라서 위험을 감수해야 할 위험이 있습니다). 왜냐하면 그와 같은 제한을받는 유일한 장소는 정신을 잃은 교육자들의 마음에 있기 때문입니다. 그러나 나는 그것을 위해 완벽하게 할 것입니다. – paxdiablo

+0

답변과 의견을 보내 주셔서 감사합니다. 정말 고맙습니다.하지만 한 가지는 잘못되었습니다 ... 어떻게 작동하는지 이해하는 것은 재미 있고 재미있는 과제입니다. 명백하게, 우리는 계승적이고 심지어 빼먹기를 할 수 있다고 생각합니다. 그것은 나에게 놀라운 것처럼 보입니다. 따라서 어떤 사람들은 코드가 작동하기를 원할뿐만 아니라 작동 방법을 알고 싶어합니다. 다시 한 번 감사드립니다! – user2052971