Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Mình làm bài về in các cạnh tam giác vuông < 500 sao cho các canh là nguyên nhưng giúp mình nhìn ra lỗi sai với

    #include "iostream.h"
    #include "math.h"
    void pitago();
    int songuyen(int x);
    int main()
    {
    cout<<"
    BO pitago co canh < 500 la :";
    pitago();
    }
    int songuyen(int x)
    {
    int k=0;
    for(int i=1;i<=x;i++)
    if(x%i==0)
    k++;
    if(k==2)
    return 1;
    else
    return 0;
    }
    void pitago()
    {
    int x, y, z;
    for(x=1;x<500;x++)
    for(y=1;y<500;y++)
    for(z=1;z<500;z++)
    {
    if((songuyen(x) == 1) && (songuyen(y) ==1) && (songuyen(z) == 1))
    if(x*x == y*y + z*z || y*y == x*x + z*z || z*z == y*y + x*x)
    cout<<"pitago("<<x<<","<<y<<","<<z<<")"<<endl;
    }
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cám ơn 2 bạn [IMG]images/smilies/biggrin.png[/IMG]. Mình đã nhìn ra lỗi của mình.
    Và bạn Prog10 cho mình hỏi là bạn có đọc sách về CTDL và Giải Thuật nâng cao không

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cũng có, nhưng mình đọc được công thức này trong 1 quyển sách đại số [IMG]images/smilies/smile.png[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Theo ý mình, bạn hãy xóa bỏ hàm songuyen đi, trong vòng lặp bạn bỏ dòng kiểm tra if((songuyen(x) == 1) && (songuyen(y) ==1) && (songuyen(z) == 1)), mã sẽ chạy ổn thôi.
    Có cách khác ngắn gọn hơn, nhưng cày cuốc với x,y,z cũng tạm ổn. Kết quả có lẽ là 2298 dòng ( chưa có kiểm tra hoán vị giữa x,y,z. Cái này là bài tập thêm cho bạn). Thân

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nhầm với số nguyên tố chăng?
    p/s: Số nguyên tố ko thử như vậy đc ^^

    Ta có CTNN của x^2+y^2=z^2 là:

    x=u^2-v^2
    y=2uv
    z=u^2+v^2, u>v [IMG]images/smilies/smile.png[/IMG]

    Thay vào và áp dụng HĐTĐN thì thấy đúng thôi.

    - Vậy thì uv < 250 và áp dụng HĐTĐN thì x=(u-v)(u+v).
    Nếu x<y<z<N thì cách này đạt O(N*sqrt(N)) phép chia.

    - Hoặc cũng có thể thử viết z từ 5 đến 500** dưới dạng tổng 2 bình phương, cũng là O(N*sqrt(N))*, nhưng là phép lấy căn + bình phương.
    Cách này hứa hẹn hơn vì có thể tối ưu hóa: Ta có thể tính sẵn các bình phương nhỏ hơn N.

    Phân tích:
    - Nếu duyệt theo x thì T ~ N*sqrt(N) phép chia VÀ ~N*logN phép nhân.
    - Nếu duyệt theo z thì T ~ 2N*sqrt(N/2) lần tra bảng ( << phép chia) và 2N*sqrt(N/2) phép lấy căn + N*logN phép nhân.
    Mà nhân < chia.

    * Do tính chất gh nên chỉ cần O(N*sqrt(N/2)), hay nói cách khác là O(N*sqrt(N/2)) time và O(sqrt(N/2)) mem.
    ** z != 3 (mod 4) nên có thể unroll loop.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Công thức thì mình nhớ mang máng nhưng còn cách tính độ phức tạp và thời gian . Bạn tính nhẩm nhanh quá.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •