Bài tập C: Nhập số n từ bàn phím và in ra các tổng S

Chào mọi người, mình vừa bắt đầu học C được vài tuần nên khả năng code còn khá yếu, hiện tại mình gặp khó khăn ở bài tập như sau:

image
Mình đã làm được 4 câu đầu, còn 2 câu cuối thì thấy hơi chật vật và chưa tìm ra hướng giải quyết.
Mọi người xem giúp mình 4 câu kia mình đã làm tối ưu chưa ạ, với cả giúp mình 2 câu cuối với. Mình cảm ơn.
Đây là phần code 4 câu đầu của mình

#include <stdio.h>

int main(){
    int n,i,x,S0=1,gt=1;    //gt la giai thua dung cho S2
    float S1=0,S2,S3,tu,mau=1;
    printf("Nhap n: ");  
    scanf("%d",&n);
    printf("Nhap x: ");  
    scanf("%d",&x);
    //In ra S0 = n! = ...
        for(i=1;i<=n;i++){  
            S0*=i;
        }  
        printf("S0 = %d! = %d",n,S0);  
    //In ra S1 = 1 + 1/2 + ... + 1/n
        for(int i = 1; i <= n; i++){
            S1 = S1 + 1.0 / i;
        }
        printf("\nS1 = 1 + 1/2 + ... + 1/n = %.2f", S1);
    //In ra S2 = 1 + 1/2! + ... 1/n!
        for(i=1;i<=n;i++){  
            gt*=i;  
            S2=S2+1.0/gt;
        }
        printf("\nS2 = 1 + 1/2! + ... 1/n! = %.2f",S2);
    //In ra S3 = 1 + x + x2/2! + x3/3! + ... xn/n!
        for(i=2;i<=n;i++){
            tu=x*i;
            mau=mau*i;
            S3=S3+tu/mau;
        }
        printf("\nS3 = 1 + x + x2/2! + x3/3! + ... + xn/n! = %.2f",S3+1+x);
}

S3=S3+tu/mau;

đây là phần tính S3 của bạn
S4 chỉ có khác S3 ở chỗ cái dấu lúc là - lúc là +
thử thêm thắt một tí

int dau = 1; // hay là -1 thì bạn coi lại

// vòng lặp for
S4=S4+dau*tu/mau; // ở đây chỉ cần nhân thêm một biến ghi nhớ dấu
dau = 0 - dau; // sau khi dùng xong, trước khi qua vòng lặp kế tiếpthì đổi dấu

như vậy là tính được S4 rồi

đối với S5 thì bạn tìm kiếm cách tính sin (tìm hàm tính sin trong c, google 10s là có ngay)

4 Likes

Mình cảm ơn ạ, mình đã làm được S4 và S5

    //In ra S4 = 1 - x + x2/2! + x3/3! + ... + (-1)^n * x^n/n!
    int dau = 1;
    float tuu, mauu = 1, S4 = 0;
        for(i = 2 ; i < n ; i++){
            tuu = x * i;
            mauu = mauu * i;
            S4 = S4 + dau * tuu / mauu;
            dau = dau * -1;
        }
        float t = pow(-1 , n) * pow(x , n);
        float m = mauu * n;
        S4 = 1 - x + S4 + t / m;
        printf("\n \nS4 = 1 - x + x2/2! + x3/3! + ... + (-1)^n * x^n/n! = %.2f", S4);
    //In ra S5 = 1 + sin(x) + sin^2(x) + sin^3(x) + ... sin^n(x)
    float S5 = 1, kq;
        for(i = 1 ; i <= n ; i++){
            kq = sin(x);
            S5 = S5 + pow(kq , i);
        }
        printf("\n \nS5 = 1 + sin(x) + sin^2(x) + sin^3(x) + ... sin^n(x) = %.2f\n ", S5);

tuy là kết quả đúng nhưng mà không biết có đúng logic không nữa :joy: rất mong nhận được nhận xét góp ý từ bạn

Đối với mấy bài này thì phần ở cuối (sau dấu …) luôn là công thức của phần tử thứ n. Bạn chỉ cần áp dụng đúng công thức đó vào vòng lặp là xong.

S0: *n => S0 = S0 * i
S1: + 1/n => S1 = S1 + 1/i
...
S4: (-1)^n * x^n / n! => S4 = S4 + (-1)^n * x^n / n!
S5: sin^n(x) => S5 = S5 + sin^n(x)

Việc còn lại là tối ưu vòng lặp bằng cách tách các phép tính mũ ra để nhân dồn vào trong mỗi lần lặp. Tránh gọi đến pow, mất thời gian thực thi.

float S5 = 0, sinx = sin(x), sinxn = 1;
for(i = 0 -> n){
   S5 += sinxn;
   sinxn *= sinx;
}

Lưu ý: 3 bài cuối có thêm x là một tham trị nữa.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?