2014-02-28 2 views
0

계승이 사용 된 주어진 계열을 계산하는 루프를 코딩하는 방법을 개념적으로 이해하는 데는 다소 시간이 걸립니다.하나의 "for"루프 내에서 Factorial을 계산하여 계열 합계를 계산하십시오.

코드를 작성했습니다. 그런 다음 선생님은 우리에게 하나의 for 루프를 사용해야한다고 말했습니다. 나는 이런 식으로하는 법을 파악할 수없는 것 같습니다. 여러 번에 걸쳐 제품의 누적 합계를 유지하는 방법을 이해하지 못합니다.

내 코드는 다음과 같습니다. 여기에는 중첩 된 for 루프가 포함됩니다. 나는 모든 도움에 정말로 감사한다.

int main() { 

/*init variables*/ 
int N; //number of terms 
float NUMER, DENOM = 1; 
float FRAC, sum = 0, x; 

/*asks user for value of N*/ 
printf("Input number of terms: "); 
scanf("%i", &N); 

/*asks user for value of x*/ 
printf("Input value of x: "); 
scanf("%f", &x); 

for (int n = 0; n <= N; n++) { 
    NUMER = (pow(x, n)); //calculates numerator 
    for (int fac = 1; fac <= n; fac++) { //calculates factorial using for loop 
     DENOM = n * fac; 
    } 
    if (DENOM <= 0) 
     printf("\n\nError, dividing by zero.\n\n"); //this is for debugging purposes; disregard 
    FRAC = NUMER/DENOM; //calculates fraction 
    sum += FRAC; //running sum of series 
} 
printf("\nSum of the series is %.1f\n\n", sum); //prints sum of series 

return 0; 
+0

하는 사용법 #include ' – chux

+0

내가 한 @chux'에 있는지 확인 - 나는 단지 그것은 꽤 명백했기 때문에 그것을 내 코드에 포함시키지 않았습니다. – Nxt3

답변

4

당신은 DENOM = n! 원하는, 그래서 당신은 단지 DENOM = 1 시작 루프 내부의 값을 업데이트 할 수 있습니다

가 대신 컴퓨팅 x^nn! 외부 루프를 통해 각 시간의
DENOM = 1; 
for (int n = 0; n <= N; n++) { 
    NUMER = (pow(x, n)); //calculates numerator 

    FRAC = NUMER/DENOM; //calculates fraction 
    sum += FRAC; //running sum of series 

    DENOM *= n+1; 
} 
4

, 당신은 초기화 할 수 있습니다 외부 루프 이전에 1.0으로 몫을, 외부 루프를 통과 할 때마다 을 곱하여 을 곱하여 다음 시리즈를 얻습니다. 이렇게하면 을 호출하여 pow(x,n)을 호출하고 내부 루프를 사용하여 계승을 계산할 수 있으며 각각은 외부 루프 을 통과합니다.

3

계승을 수작업으로 계산하면 어떻게 될지 생각하면이 코드를 쉽게 작성하는 방법을 알 수 있다고 생각합니다.

11!을 계산하려고합니다. 글쎄, 11시에 시작하고 10을 곱합니다. 이제 110이됩니다. 이제 9를 곱합니다. 이제 8을 곱합니다.

볼 수 있듯이 11, 10, 9, 8... 시리즈는 for 루프가 될 것입니다. 변수에 '현재 답변'을 유지하고 for 루프에서 제공된 숫자를 계속 곱하십시오.

0

루프를 반대로 작업하면보다 안정적인 답을 얻을 수 있습니다. 많은 무한한 합계가 수치 적으로 가장 작은 용어를 먼저 더 잘 합산합니다.

f (x, n) = x^0/0! + x^1/1! + x^2/2! + ... + x^n/n!


는 N 마지막 항의 합하자 ... 합 S(x,n) = x/n
는 2 개 마지막 항의 합 S(x,n-1) = x/(n-1) + x/(n-1)*S(x,n)
은 마지막 3 개 항의 합은 S(x,n-2) = x/(n-2) + x/(n-2)*S(x,n-1)
하자하자하자 S(x,1) = x/(1) + x/(1)*S(x,1)

double e(double x, unsigned n) { 
    double sum = 0.0; 
    while (n > 0) { 
    sum = x*(1 + sum)/n; 
    n--; 
    } 
    sum += 1.0; // The zero term 
    return sum; 
} 

경우에도 n 1000처럼 큰 공지 사항 및 수학적 해답이 될 < DBL_MAX,이 루프는 너무 쉽게 부동 소수점 오버플로로 실행되지 않습니다.

그러나 코드가 순방향 루프에서 수행되어야하는 경우 아래에서 각 용어가 오버플로 될 수있는 별도의 제품이 아니라 통합 계산으로 계산됩니다.

double e_forward(double x, unsigned n) { 
    double sum = 1.0; 
    double term = 1.0; 
    for (unsigned i = 1; i <= n; i++) { 
    term *= x/i; 
    sum += term; 
    } 
    return sum; 
} 
0

그것은 복잡해 보인다. 간결성이다 또는 당신의 친구가 될 수 있습니다 D

나는 것보다 훨씬 더 복잡 할 필요가 있다고 생각하지 않습니다

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 

    double limit = 10 ; // how far do we want to go? 
    double x  = 2 ; // some value for X 
    double xn = 1 ; // by definition, for all X, X^0 is 1 
    double nf = 1 ; // by convention, 0! is 1 
    double value = 0 ; 
    double sum = 0 ; 
    double n  = 0 ; 

    while (n < limit) 
    { 
    value = xn/nf ; // compute the next element of the series 
    sum += value ; // add that to the accumulator 
    xn *= x  ; // compute the *next* value for X^n 
    nf *= (++n) ; // compute the *next* value for N! 
    } 

    return 0; 
} 
관련 문제