Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: [C]dùng cách nào để giải quyết cái dấu cộng trừ +/-

  1. #1
    Ngày gia nhập
    09 2006
    Bài viết
    12

    Smile [C]dùng cách nào để giải quyết cái dấu cộng trừ +/-

    vd: mình muốn tính bài toán này

    a = 1 - 3 + 5 - 7 + 9 ... (+/-) (2*n-1).

    điều kiện nhập vào số n (nguyên dương) và viết bằng đệ quy.

    unsigned long ketqua(int n)
    {
    // làm sao giải quyết cài dấu +,-
    }

  2. #2
    No Avatar
    buianhtuanhn Khách

    bạn chỉ cần đổi công thức tính là
    a= 1 - 3 + 5 -7 +...+(-1)^(n-1)(2*n-1)

    giờ bạn có thể làm được rồi chứ

  3. #3
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    có nhiều cách để làm điều này, cách dễ thấy là:
    bạn cần phát hiện tính chất của dãy số đó
    ví dụ như
    n=1 -> dấu +
    n=2 -> dấu -
    n=3 -> dấu +
    ...
    từ đó suy ra cách làm. Với tính chất như trên thì 1 cách làm cụ thể là:

    Code:
    long ketqua(int n) /*bạn dùng unsigned long là chưa chính xác*/
    {
       if (n==0) return 0 /*điều kiện thoát đệ quy, điều kiện thoát là điều bắt buộc khi viết đệ quy */
       int sign=-1;
       if (n%2 > 0) sign=1; 
       /* 2 dòng trên là để xử lý dấu như bạn mong muốn */
       return (sign*2*(n-1)) + ketqua(n-1);
    }
    bạn nói đúng, mình cũng đồng ý như thế, nhưng cái công thức của bạn sử dụng pow (hàm mũ) rất hao tốn performance

    bạn nên biết
    những phép toán trên số thực luôn tốn hơn gấp nhiều lần về thời gian thực hiện so với số nguyên
    những phép toán trên số thực dấu chấm động ví dụ như hàm pow, sqrt, ... luôn tốn hơn gấp nhiều lần về thời gian thực hiện so với số thực dấu chấm tĩnh

  4. #4
    Ngày gia nhập
    08 2006
    Bài viết
    59

    Tui nghĩ mình có thể làm:

    hàm ketqua(unsigned int n, int sign): sẽ gọi đệ qui ketqua(n+2, -sign)
    Hàm này có thể tính:
    sign*n
    hoặc:
    nếu sign > 0 thì xài n, ngược lại thì xài -n

    (có gì sai sót mong được góp ý, xin cám ơn)

    -thân

  5. #5
    Ngày gia nhập
    07 2006
    Bài viết
    121

    Đầu tiên bạn xem đoạn giả lập hàm mủ của tôi.
    http://forums.congdongcviet.com/showthread.php?t=909

    Tiếp theo tôi giải quyết bài trên của bạn như sau (không dùng đệ quy):
    Code:
    n=1            KQ=1
    n=2            KQ=1+3
    n=3            KQ=1+3-5=1-2
    n=4            KQ=1+3-5+7=1-2+7
    n=5            KQ=1+3-5+7-9=1-2-2=1-2*2
    n=6            KQ=1+3-5+7-9+11=1-2*2+11
    n=7            KQ=1+3-5+7-9+11-13=1-2-2-2=1-2*3
    Từ đây tôi tổng quát hóa lên:
    Code:
    nếu n=1 KQ=1
    nếu n!=1 n chẳn KQ=1-2*((n-1)/2)+(2*n-1)
    nếu n!=1 n lẻ KQ=1-2*((n-1)/2).
    chú ý :(n-1)/2 phải là phép chia lấy phần nguyên.
    Từ đây ta có thuật toán sau:
    Code:
    long Ketqua(unsigned int n)
    {
            int KQ;
            if(n==0)return 0;
            if(n==1)return 1;
            KQ=1-2*((n-1)/2);
            if(n%2==0) KQ=KQ+(2*n-1);
            return KQ;
    }
    Đã được chỉnh sửa lần cuối bởi shinichi_haha : 04-12-2006 lúc 04:18 PM.

  6. #6
    Ngày gia nhập
    08 2006
    Bài viết
    59

    Mặc định [C]dùng cách nào để giải quyết cái dấu cộng trừ +/-

    n=1 KQ=1
    n=2 KQ=1+3
    n=3 KQ=1+3-5=1-2
    n=4 KQ=1+3-5+7=1-2+7
    n=5 KQ=1+3-5+7-9=1-2-2=1-2*2
    n=6 KQ=1+3-5+7-9+11=1-2*2+11
    n=7 KQ=1+3-5+7-9+11-13=1-2-2-2=1-2*3
    => tui nghĩ bạn bị lộn về dấu:

    n=7 KQ=1-3+5-7+9-11+13 chớ không phảI KQ=1+3-5+7-9+11-13

    Thêm nữa tui nghĩ có lẽ người ra đề muốn mình tập dợt đệ qui.
    Cách giải của bạn ra ngoài luồng suy nghĩ bình thường (có lẽ mọi người bị chữ "đệ qui" làm cho không suy nghĩ ra hướng khác) => rất hay !!!
    Nếu làm theo hướng của bạn, để cho chặt chẽ tui nghĩ nên xài hiệu của 2 cấp số cộng

    (có gì sai sót mong được góp ý, xin cám ơn)

    -thân

  7. #7
    Ngày gia nhập
    07 2006
    Bài viết
    121

    Còn viết theo đệ quy như sau:
    Ta thấy bài toán được phân tích là f(n)=f(n-1) + [-] (2*n-1)
    với + khi n chẳn. - khi n lẻ.
    code bài toán đơn giản như sau:
    Code:
    long Ketqua(unsigned int n)
    {
      if(n==0)return 0;
      if(n==1)return 1;
      if(n%2==0)return Ketqua(n-1)+(2*n-1);
      return Ketqua(n-1)-(2*n-1);
    
    }

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    12

    cảm ơn các bạn đã có nhiều góp ý.

    bài này mình muốn làm đệ quy, với giá trị nhập vào là n, kết thúc là (+/-) (2*n-1).

    xét phần (+/-) dùng cách của bạn "buianhtuanhn" (-1)^(n-1) => đã giải quyết rất tốt. (một số bạn có nhầm lẫn, ở đây không có giá trị chẵn, nên không dùng chẳn lẻ để xét dấu)

    phần giá trị cuối (2*n-1) hình như các bạn chưa làm đúng. mong tiếp tục nhận được góp ý.

  9. #9
    Ngày gia nhập
    07 2006
    Bài viết
    121

    Đúng rồi mình có hơi nhầm dấu!==>Sai bài toán
    Trích dẫn Nguyên bản được gửi bởi def
    (một số bạn có nhầm lẫn, ở đây không có giá trị chẵn, nên không dùng chẳn lẻ để xét dấu).
    Ở đây a = 1 - 3 + 5 - 7 + 9 ... (+/-) (2*n-1).
    thì hàm đệ quy của nó như sau f(n)=f(n-1)+ (-1)^(n-1)*(2*n-1);
    thì nếu n là chẳn thì có phải f(n)=f(n-1)-(2*n-1);
    nếu n là lẻ thì f(n)=f(n-1)+(2*n-1) đúng không ?Ở đây mình xét chẳn lẻ của n.

    Vậy code chuong trình viết theo đệ quy là:
    Code:
    long f(unsigned int n)
    {
      if(n==0)return 0;
      if(n==1)return 1;
      if(n%2==0)return f(n-1)-(2*n-1);
      return f(n-1)+(2*n-1);
    
    }

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    12

    Trích dẫn Nguyên bản được gửi bởi shinichi_haha
    Code:
    long f(unsigned int n)
    {
      if(n==0)return 0;
      if(n==1)return 1;
      if(n%2==0)return f(n-1)-(2*n-1);
      return f(n-1)+(2*n-1);
    
    }
    mình chạy thử:

    gọi hàm printf ("%d",f(2));
    Code:
    => f(n = 2)
         => (n%2=0) = TRUE return f(1) - (1);
    
    đệ quy f(1)
    => f(n = 1)
         => return 1;
    
    => vây bài này sẽ là 1 - 1 = 0;
    
    nhưng theo ý mình
    
    gọi f(2) => triển khai ra sẽ là f = 1 - 3 = -2;
    
    có lẽ bài này vẫn sai.

Các đề tài tương tự

  1. Trả lời: 1
    Bài viết cuối: 13-11-2011, 02:12 AM
  2. dùng GA giả quyết bài toán tối ưu hàm 1 biến như thế nào..
    Gửi bởi princehai trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 07-10-2011, 04:45 PM
  3. Algorithm Cách giải quyết lỗi "Specified cast is not valid" khi dùng KeyValuePair trong HashTable như thế nào ?
    Gửi bởi chick trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 18-09-2011, 09:17 PM
  4. Đề xuất Thêm flag "Đã giải quyết" (Resolved) hay "chưa giải quyết" cho topic
    Gửi bởi cuonchagio trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 3
    Bài viết cuối: 28-01-2010, 05:34 PM
  5. Buổi hội thảo về kỹ năng ra quyết định và giải quyết vấn đề
    Gửi bởi nguoingu trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 11-08-2009, 03:26 PM

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