Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: lỗi trong tính tổng dãy đối xứng về dấu

  1. #1
    Ngày gia nhập
    10 2011
    Bài viết
    1

    Mặc định lỗi trong tính tổng dãy đối xứng về dấu

    các bác ơi em code cái tính





    em code như sau mà ko biết là sai ở đâu mong các bác chỉ giáo vs ak
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. int gt(int i)
    5. {
    6.     if (i==0) return(1);
    7.     else return(i*gt(i-1));
    8. }
    9. int main()
    10. {
    11.     int n,j,i,dem;
    12.     float s;
    13.     printf("Nhap n: \n");
    14.     scanf("%d",&n);
    15.     s=0;
    16.         dem=(n-1)/2;
    17.     for(i=1;i<=n;i++)
    18.        
    19.     {
    20.         if(i%2==1)
    21.         {
    22.            
    23.             for(j=0;j<=dem;j++)
    24.             {
    25.        
    26.         s+=pow(-1,j)*(float)1/gt(i);
    27.             }
    28.        
    29.         }
    30.         }
    31.        
    32.         printf("\tTong giai thua =%f",s);
    33.         getch();
    34.         }

  2. #2
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Dấu chỉ cần lắc qua lắc lại thôi chứ tội gì phải gọi cái hàm pow vào đó

    Tong += dau * thuaSo;
    dau = -dau;

    Vả lại bài này không cần hàm giai thừa. Dùng một thừa số, làm đến đâu chia đến đó.

  3. #3
    Ngày gia nhập
    10 2011
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Dấu chỉ cần lắc qua lắc lại thôi chứ tội gì phải gọi cái hàm pow vào đó

    Tong += dau * thuaSo;
    dau = -dau;

    Vả lại bài này không cần hàm giai thừa. Dùng một thừa số, làm đến đâu chia đến đó.
    a minh họa vào code cho e vs ak .em chưa hiểu ý bác lắm.

  4. #4
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Thực sự bạn viết code mà không có chú thích (comments) nên đọc vào không hiểu thuật toán của bạn sai hay code sai. Vì vậy tôi miễn phê bình nhiệm vụ của biến dem trong code của bạn.

    Cái công thức tính s trên hơi kỳ cục

    Trích dẫn Nguyên bản được gửi bởi giang92 Xem bài viết
    .....
    tại sao 1/1! và 1/3! lại (+) mà 1/5! thì (-) ? theo công thức thì 1/7! là (+) hay (-) ?

    hỏi cách khác,
    cứ 2 lần cộng, 2 lần trừ hay
    cứ 2 lần cộng, 1 lần trừ hay
    cứ 1 lần cộng, 1 lần trừ, riêng số 1 thì cộng
    cứ 1 lần cộng, 1 lần trừ, công thức trên viết sai

    Tôi không có nhiều thì giờ để chỉnh code. Trước hết bạn phải xác định công thức rõ ràng đã.

    tb: đầu óc tôi hơi tối, gặp mấy bài dùng từ ngữ tắt (vs, j, ...) tôi đọc không hiểu.

  5. #5
    Ngày gia nhập
    10 2011
    Bài viết
    1

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. int gt(int i)
    5. {
    6.     if (i==0) return(1);
    7.     else return(i*gt(i-1));
    8. }
    9. int main()
    10. {
    11.     int n,j,i,dem;
    12.     float s;
    13.     printf("Nhap n: \n");
    14.     scanf("%d",&n);
    15.     s=0;
    16.         dem=(n-1)/2;// dem so phan tu trong tong
    17.     for(i=1;i<=n;i++)
    18.        
    19.     {
    20.         if(i%2==1)
    21.         {
    22.            
    23.             for(j=0;j<=dem;j++)// dung j de xac dinh dau + hay - cua cac phan tu trong tong
    24.             {
    25.        
    26.         s+=pow(-1,j)*(float)1/gt(i);
    27.             }
    28.        
    29.         }
    30.         }
    31.        
    32.         printf("\tTong giai thua =%f",s);
    33.         getch();
    34.         }
    ở đây em đếm số phần tử trong tổng bằng cách lấy int ((n-1)/2)
    dấu ở đây chỉ là đan dấu nhau thôi mà a .phần tử đầu tiên mang dấu + tiếp theo mang dấu -
    cái chính là dùng
    Code:
     for(j=0;j<=dem;j++)// dung j de xac dinh dau + hay - cua cac phan tu trong tong
                {
            
            s+=pow(-1,j)*(float)1/gt(i);
                }
    thì nó lại bị lỗi .
    ý của em là khi ta j=0 .thì -1^0 bằng 1. nên số thứ 1 mang dấu +
    j=1 thì số thứ 2 mang dấu âm .cứ thế cho tới khi j=đếm
    em sửa giúp em vào code để chạy đc ko ak . quả thực em ko hiểu sai ở đâu cả ak

  6. #6
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Mặc định lỗi trong tính tổng dãy đối xứng về dấu

    1. Trong tất cả các hàm thư viện của math, tôi rất ngại dùng hàm pow. Nếu tránh được thì tôi luôn luôn tránh. Nhất là dùng hàm này để tính 1/-1 thì quá phí.
    Người ta có thể dùng ((i&1)? 1 : -1) ---> số lẻ thì 1, số chẵn thì -1

    2. Dùng hàm giai thừa sẽ dẫn tới bị tràn số. Nhớ mang máng là biến int chỉ chứa tới giai thừa 15. Hầu hết các hệ thống đều không cho biết bị tràn số, chỉ cho kết quả sai thôi. Điều này đã từng được nhiều người giỏi bàn kỹ qua, chịu khó tìm các bài viết cũ sẽ thấy.

    dấu ở đây chỉ là đan dấu nhau thôi mà a .phần tử đầu tiên mang dấu + tiếp theo mang dấu -
    Vậy thì công thức phải là:

    s = 1/1! - 1/3! + 1/5! - ... (+-)1/n! <--- nếu n là số chẵn thì thừa số cuối cùng là (+-)1/(n-1)!

    Trở lại code của bạn. Cách đếm như vậy là không đúng

    C Code:
    1. // lưu ý rằng (n+2)! = n! * (n+1) * (n+2)
    2. int dau = 1; // dấu cộng hoặc trừ
    3. double ts = 1.0, tong = 0.0;
    4. for (int i=1; i <= n; i += 2) // lưu ý là i bước nhảy 2
    5. {
    6.   tong += dau*ts; // cộng thừa số hiện tại vào tổng
    7.   ts /= (i+1)*(i+2); // tính thứa số mới
    8.   dau = -dau; // đổi dấu
    9. }
    10. // có cách viết code ngắn hơn nhưng hơi khó hiểu, viết như vầy dễ hiểu hơn

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn