Trang 2/3 Đầu 123 cuối
kết quả từ 13 tới 24 trên 32

Hỏi về code phương trình bậc 2 bằng C

  1. #13
    Ðến Từ
    Hà Nội
    Thành Viên Thứ: 358027
    Bài gửi
    1.681

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Tối ưu là rất tốt, 1 bài toán phải tính hết trường hợp có thể xảy ra để tránh bug, ủng hộ aloxinh_nb, if lồng if (delta) bạn làm chưa hết

    Mã:
    #include <stdio.h>#include <conio.h>
    #include <math.h>
    
    
    void main()
    {
        float a,b,c,delta,x1,x2;
    	
        printf("Phuong trinh bac 2 co dang ax^2 + bx + c = 0. Nhap a :");
        scanf("%f",&a);
        printf("Nhap b :");
        scanf("%f",&b);
        printf("Nhap c :");
        scanf("%f",&c);
    	
        if (a==0)
        {
            if (b==0)
            {
                if (c==0) printf("Phuong trinh vo so nghiem");
                else printf("Phuong trinh vo nghiem");
            }
            else
            {
                x1=-c/b;
                printf("Phuong trinh co 1 nghiem:%f",x1);
            }
        }
        else
        {
            delta=b*b-4*a*c ;
    		
            if (delta<0) printf("Phuong trinh vo nghiem");
            {
                if (delta==0)
                {
                    x1=-b/(2*a);
                    printf("Phuong trinh da nghiem kep:%f",x1);
                }
                else
                {
                    x1=(-b+sqrt(delta))/(2*a);
                    x2=(-b-sqrt(delta))/(2*a);
                    printf("Phuong trinh co 2 nghiem phan biet");
                    printf("%f",x1);
                    printf("%f",x2);
                }
            }
        }
    }
    www.thuthuatdoday.tk - Chia sẻ thủ thuật, tiện ích máy tính

  2. Đã cảm ơn gunshot9x:



  3. #14
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 402126
    Giới tính: Nữ
    Bài gửi
    22

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Bài dễ và nhỏ như thế mà bu đông dữ. Với em, tối ưu là thuật toán. Còn những chi tiết nhỏ nhặt thì thầy em bảo sẽ có người làm thay. Cái chính là thuật toán. Mọi người thích tối ưu sao không ai vào bài viết này ủng hộ quan điểm của anh tengiday nhỉ và lựa 1 bài vô cùng đơn giản để "ra uy"?
    Con gà ghét nhau vì tiếng gáy!!!
    HTML Code:
    http://vforum.vn/diendan/showthread.php?114045-so-sanh-du-lieu-giua-2-datagridview-va-them-vao-datagridview-moi-nhung-qua-cham
    Đoạn code của bạn gunshot9x chỉ thêm dấu ngoặc -> tối ưu???

  4. 2 thành viên đã cảm ơn LanSG9x:


  5. #15
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    881

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Trích Nguyên văn bởi LanSG9x Xem bài viết
    Bài dễ và nhỏ như thế mà bu đông dữ. Với em, tối ưu là thuật toán. Còn những chi tiết nhỏ nhặt thì thầy em bảo sẽ có người làm thay. Cái chính là thuật toán. Mọi người thích tối ưu sao không ai vào bài viết này ủng hộ quan điểm của anh tengiday nhỉ và lựa 1 bài vô cùng đơn giản để "ra uy"?
    Con gà ghét nhau vì tiếng gáy!!!
    HTML Code:
    http://vforum.vn/diendan/showthread.php?114045-so-sanh-du-lieu-giua-2-datagridview-va-them-vao-datagridview-moi-nhung-qua-cham
    Đoạn code của bạn gunshot9x chỉ thêm dấu ngoặc -> tối ưu???
    Mình cám ơn bạn. Ai cũng có lý cả. Bạn cũng không nên quá quan tâm tới vấn đề này làm gì. Bạn cứ tập trung vào thuật toán là được.

    Good luck.
    LCD: 13.3" 1920x1080 IPS
    CPU: Intel i7 - 4700MQ (2.4 GHz - 3.4 GHz)
    GPU: Nvidia GTX 765m with GDDR5 2GB
    RAM: 2x8GB G.Skill 2133
    HDD: Samsung SSD 850 Pro 512 GB
    2 kg.

  6. 3 thành viên đã cảm ơn tengiday:


  7. #16
    Ðến Từ
    Hà Nội
    Thành Viên Thứ: 358027
    Bài gửi
    1.681

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Trích Nguyên văn bởi LanSG9x Xem bài viết
    Bài dễ và nhỏ như thế mà bu đông dữ. Với em, tối ưu là thuật toán. Còn những chi tiết nhỏ nhặt thì thầy em bảo sẽ có người làm thay. Cái chính là thuật toán. Mọi người thích tối ưu sao không ai vào bài viết này ủng hộ quan điểm của anh tengiday nhỉ và lựa 1 bài vô cùng đơn giản để "ra uy"?
    Con gà ghét nhau vì tiếng gáy!!!
    HTML Code:
    http://vforum.vn/diendan/showthread.php?114045-so-sanh-du-lieu-giua-2-datagridview-va-them-vao-datagridview-moi-nhung-qua-cham
    Đoạn code của bạn gunshot9x chỉ thêm dấu ngoặc -> tối ưu???
    Nếu đọc mà hiểu sai ý là do các bạn hiểu sai (tự đọc, tự hiểu)

    Tối ưurất tốt, 1 bài toán phải tính hết trường hợp có thể xảy ra để tránh bug, ủng hộ aloxinh_nb, if lồng if (delta) bạn làm chưa hết

    Cái trên chỉ bổ sung điều bạn aloxinh_nb thôi nha bạn (if lồng if giảm bớt công đoạn xét không cần thiết thay vì phải xét full trường hợp), bạn không để ý những điều nhỏ nhặt mà sao tối ưu được. Mình chẳng quan tâm mức phức tạp của thuật toán, cái đó do mấy người đi trước khái quát lại thành lưu đồ để dễ dàng phân tích, nói tên gọi thuật toán (nếu đã học qua) là biết sẽ biết ngay nó chạy ra sao, nguyên tắc chung chỉ cần tuân thủ: chia để trị, giảm công việc phải thực hiện,quản lý tài nguyên cấp phát chặt chẽ thì tự nhiên sẽ được tối ưu hay công việc đó còn gọi là xây dựng thuật toán (giải thuật)

    Còn vấn đề bạn mắc phải là do thằng DataGridView khi datasource có dữ liệu lớn, khoảng 10.000 đến 100.000 dòng thì control này bắt đầu build chậm (mỗi đối tượng trong control .NET tối ưu trong một mức độ nhất định, chứ không phải là toàn năng)

    Có 2 cách để giải quyết:

    1. là chuyển sang dùng control khác chẳng hạn như ObjectListView

    2. hướng dẫn của Microsoft giúp cải thiện hiệu suất khi dùng
    dataGridView với Big Data

    https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/performance-tuning-in-the-windows-forms-datagridview-control

    Còn code so sánh do bạn duyệt toàn bộ dataGridView1 (n1) đem so sánh với dataGridView2 (n2) dẫn tới phải thực hiện n1*n2 công việc dù có tìm thấy hay không, tự nhiên lãng phí tài nguyên vì lệnh so sánh str(n)==str(m), dù tìm thấy rồi vẫn cứ thực hiện cho hết vòng lặp

    Nhìn thuật toán bạn viết thì đề bài sẽ như sau:

    Input: cho dataGridView1, dataGridView2
    Output: Tìm dữ liệu cùng tồn tại trong cả 2 (dataGridView1, dataGridView2) lưu vào dataGridView3

    xử lý đầu vào
    dataGridView1, dataGridView2 loại bỏ dữ liệu trùng lặp nếu có tồn tại (có thể dùng Sort sắp xếp, so sánh dòng liền kề để xóa dữ liệu trùng)

    tìm dữ liệu trùng
    for
    tìm n phần tử đầu dataGridView1 có chứa trong dataGridView2 có thể dùng IndexOf và chỉ cần xét vùng dữ liệu vừa lọc, giống thì add vào dataGridView3, rồi bỏ qua vòng đó, xét qua vòng mới luôn mà khỏi cần xét hết toàn bộ dữ liệu lọc (trong for chứa break để dừng vòng lặp đó, không cần thực hiện tiếp nữa, cấu trúc for(break/continue) cũng giống if(else) hay được dùng để tối ưu xử lý)

  8. #17
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 336874
    Giới tính: Nữ
    Bài gửi
    281

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Trích Nguyên văn bởi tengiday Xem bài viết
    Mình cám ơn bạn. Ai cũng có lý cả. Bạn cũng không nên quá quan tâm tới vấn đề này làm gì. Bạn cứ tập trung vào thuật toán là được.

    Good luck.
    Mình không biết về lập trình, nhưng cách nói chuyện của bạn rất hay, không quá phô trương chỉ tập trung vào vấn đề, bạn nào cần hiểu hỏi thì giải thích 1 cách rất thân thiện làm cho người ta phục
    Trích Nguyên văn bởi LanSG9x Xem bài viết
    Bài dễ và nhỏ như thế mà bu đông dữ. Với em, tối ưu là thuật toán. Còn những chi tiết nhỏ nhặt thì thầy em bảo sẽ có người làm thay. Cái chính là thuật toán. Mọi người thích tối ưu sao không ai vào bài viết này ủng hộ quan điểm của anh tengiday nhỉ và lựa 1 bài vô cùng đơn giản để "ra uy"?
    Con gà ghét nhau vì tiếng gáy!!!
    HTML Code:
    http://vforum.vn/diendan/showthread.php?114045-so-sanh-du-lieu-giua-2-datagridview-va-them-vao-datagridview-moi-nhung-qua-cham
    Đoạn code của bạn gunshot9x chỉ thêm dấu ngoặc -> tối ưu???
    mình cũng ủng hộ bạn


  9. Đã cảm ơn Sút toàn trật:


  10. #18
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 402126
    Giới tính: Nữ
    Bài gửi
    22

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Trích Nguyên văn bởi gunshot9x Xem bài viết
    Cái trên chỉ bổ sung điều bạn aloxinh_nb thôi nha bạn (if lồng if giảm bớt công đoạn xét không cần thiết thay vì phải xét full trường hợp), bạn không để ý những điều nhỏ nhặt mà sao tối ưu được. Mình chẳng quan tâm mức phức tạp của thuật toán, cái đó do mấy người đi trước khái quát lại thành lưu đồ để dễ dàng phân tích, nói tên gọi thuật toán (nếu đã học qua) là biết sẽ biết ngay nó chạy ra sao, nguyên tắc chung chỉ cần tuân thủ: chia để trị, giảm công việc phải thực hiện,quản lý tài nguyên cấp phát chặt chẽ thì tự nhiên sẽ được tối ưu hay công việc đó còn gọi là xây dựng thuật toán (giải thuật)
    Nói bao h cũng dễ hơn làm. Em k thích cái kiểu học một ít mà nghĩ mình gì cũng biết, nhất là thuật toán là một thứ có hẳn 1 ngành hẳn hoi. Nói như bạn thì chỉ cần biết +, -, *, / là tôi làm bài toán nào cũng được. Cách nói của bạn cái quan trọng là "làm thế nào" thì tịt, nói những cái ai cũng biết!!!
    Nói nhiều vô ích, bạn giải cho em xem, dùng dòng in đậm tô đỏ của bạn để tối ưu nhé:
    Mã:
    8) Cho N điểm trên mặt phẳng Oxy. Em hãy lập trình đếm xem có bao nhiêu tam giác được tạo thành từ N điểm trên thỏa mãn các tính chất sau:
    a) Là tam giác đều hoặc vuông, và
    b) 3 đỉnh của tam giác không được thẳng hàng, và
    c) Tâm của đường tròn ngoại tiếp qua 3 đỉnh của tam giác là gốc tọa độ O.
    
    Dữ liệu vào: TAM_GIAC_IN.TXT
    - Dòng đầu tiên chứa số nguyên N với 3 < N < 1000.
    - N dòng tiếp theo, mỗi dòng chứa tọa độ của mỗi điểm theo kiểu tọa độ cầu (polar coordinate) có dạng:
    R GOC
    với R là khoảng cách từ gốc tọa độ O tới điểm đó và GOC là góc ở tâm O tính từ trục Ox (đơn vị là độ).
    Biết rằng:
    + R là số nguyên với 0 < R < 10^5.
    + GOC là số nguyên với 0 <= GOC < 360.
    + N điểm đôi một khác nhau.
    
    Dữ liệu ra: TAM_GIAC_OUT.TXT
    1 số duy nhất là số lượng tam giác thỏa mãn 3 tính chất a, b, c như trên.
    
    Ví dụ:
    5
    1 0
    1 45
    2 20
    3 40
    1 180
    
    Kết quả là 1, được tạo thành từ (1, 0), (1, 45), và (1, 180).
    Em cần code, k nói nữa. Cho em thêm vài lời giải thích rõ ràng. Như vậy mới biết đúng sai, nhanh chậm. Bạn làm tới tối thứ 5 7h nha! Bạn k cần đọc hay kiểm tra dữ liệu đâu, chỉ cần cho mấy cái hàm để gọi là đẹp.

  11. #19
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 402126
    Giới tính: Nữ
    Bài gửi
    22

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Trích Nguyên văn bởi tengiday Xem bài viết
    Mình cám ơn bạn. Ai cũng có lý cả. Bạn cũng không nên quá quan tâm tới vấn đề này làm gì. Bạn cứ tập trung vào thuật toán là được.

    Good luck.
    Em cám ơn anh @tengiday nhiều lắm luôn. Một dòng comment mà thể hiện được rất rõ con người. Em rất hy vọng được gặp anh ở ngoài đời. Chỉ là em khá nóng tính. Mặc dù là nữ chứ. Em mà nhịn sẽ k yên được. Có lẽ tuổi trẻ anh ạ.

    Trích Nguyên văn bởi Sút toàn trật Xem bài viết
    Mình không biết về lập trình, nhưng cách nói chuyện của bạn rất hay, không quá phô trương chỉ tập trung vào vấn đề, bạn nào cần hiểu hỏi thì giải thích 1 cách rất thân thiện làm cho người ta phục

    mình cũng ủng hộ bạn
    Em cám ơn anh nhiều nha! Em xem mấy bài trả lời cũng có cảm giác chèo thuyến trong bụng tể tướng vậy.

  12. #20
    Ðến Từ
    Hà Nội
    Thành Viên Thứ: 358027
    Bài gửi
    1.681

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Trích Nguyên văn bởi LanSG9x Xem bài viết
    Nói bao h cũng dễ hơn làm. Em k thích cái kiểu học một ít mà nghĩ mình gì cũng biết, nhất là thuật toán là một thứ có hẳn 1 ngành hẳn hoi. Nói như bạn thì chỉ cần biết +, -, *, / là tôi làm bài toán nào cũng được. Cách nói của bạn cái quan trọng là "làm thế nào" thì tịt, nói những cái ai cũng biết!!!
    Nói nhiều vô ích, bạn giải cho em xem, dùng dòng in đậm tô đỏ của bạn để tối ưu nhé:
    Mã:
    8) Cho N điểm trên mặt phẳng Oxy. Em hãy lập trình đếm xem có bao nhiêu tam giác được tạo thành từ N điểm trên thỏa mãn các tính chất sau:
    a) Là tam giác đều hoặc vuông, và
    b) 3 đỉnh của tam giác không được thẳng hàng, và
    c) Tâm của đường tròn ngoại tiếp qua 3 đỉnh của tam giác là gốc tọa độ O.
    
    Dữ liệu vào: TAM_GIAC_IN.TXT
    - Dòng đầu tiên chứa số nguyên N với 3 < N < 1000.
    - N dòng tiếp theo, mỗi dòng chứa tọa độ của mỗi điểm theo kiểu tọa độ cầu (polar coordinate) có dạng:
    R GOC
    với R là khoảng cách từ gốc tọa độ O tới điểm đó và GOC là góc ở tâm O tính từ trục Ox (đơn vị là độ).
    Biết rằng:
    + R là số nguyên với 0 < R < 10^5.
    + GOC là số nguyên với 0 <= GOC < 360.
    + N điểm đôi một khác nhau.
    
    Dữ liệu ra: TAM_GIAC_OUT.TXT
    1 số duy nhất là số lượng tam giác thỏa mãn 3 tính chất a, b, c như trên.
    
    Ví dụ:
    5
    1 0
    1 45
    2 20
    3 40
    1 180
    
    Kết quả là 1, được tạo thành từ (1, 0), (1, 45), và (1, 180).
    Em cần code, k nói nữa. Cho em thêm vài lời giải thích rõ ràng. Như vậy mới biết đúng sai, nhanh chậm. Bạn làm tới tối thứ 5 7h nha! Bạn k cần đọc hay kiểm tra dữ liệu đâu, chỉ cần cho mấy cái hàm để gọi là đẹp.
    Có môn thuật toán riêng vì nó giúp bạn có một số thuật toán chuyên sâu cơ bản hay được dùng, để bạn có tiền đề cho việc xây dựng các thuật toán phức tạp sau này. Một người mà đi hỏi xin code thì sẽ tự biết ra sao rồi, lười suy nghĩ.

    Ví dụ:
    5
    1 0
    1 45
    2 20
    3 40
    1 180

    Kết quả là 1, được tạo thành từ (1, 0), (1, 45), và (1, 180).

    Còn đầu bài là cho hệ tọa độ cực (r, PI) thay vì tọa độ đề các (x, y)

    + Là tam giác đều hoặc vuông
    + 3 đỉnh của tam giác không được thẳng hàng
    + Tâm của đường tròn ngoại tiếp qua 3 đỉnh của tam giác là gốc tọa độ O

    => tìm tập 3 điểm trong n điểm, có r bằng nhau và PI khác nhau và sao cho có ít nhất [hiệu 2 cặp PI] = 180 (vuông) hoặc [hiệu 2 cặp PI] chung cạnh = 120 (đều), lâu không học toán cao cấp nên quên các tính chất trong tọa độ cực rồi

  13. #21
    Ðến Từ
    Hà Nội
    Thành Viên Thứ: 358027
    Bài gửi
    1.681

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Mã:
    (3, 0)
    (1, 150)
    (1, 200)
    (1, 180)
    (3, 360)
    (4, 30)
    (1, 300)
    (4, 150)
    (6, 200)
    (3, 120)
    (1, 0)
    (3, 80)
    (3, 200)
    (1, 120)
    (4, 150)
    (1, 240)
    (3, 320)
    (1, 60)
    (2, 360)
    (4, 200)
    Tam giac deu: (3, 80), (3, 200), (3, 320)
    Tam giac vuong: (1, 180), (1, 0), (1, 150)
    Tam giac vuong: (1, 180), (1, 0), (1, 200)
    Tam giac vuong: (1, 180), (1, 0), (1, 300)
    Tam giac vuong: (1, 180), (1, 0), (1, 120)
    Tam giac vuong: (1, 180), (1, 0), (1, 240)
    Tam giac vuong: (1, 180), (1, 0), (1, 60)
    Tam giac vuong: (1, 300), (1, 120), (1, 150)
    Tam giac vuong: (1, 300), (1, 120), (1, 200)
    Tam giac vuong: (1, 300), (1, 120), (1, 180)
    Tam giac vuong: (1, 300), (1, 120), (1, 0)
    Tam giac vuong: (1, 300), (1, 120), (1, 240)
    Tam giac vuong: (1, 300), (1, 120), (1, 60)
    Tam giac deu: (1, 0), (1, 120), (1, 240)
    Tam giac vuong: (1, 240), (1, 60), (1, 150)
    Tam giac vuong: (1, 240), (1, 60), (1, 200)
    Tam giac vuong: (1, 240), (1, 60), (1, 180)
    Tam giac vuong: (1, 240), (1, 60), (1, 300)
    Tam giac vuong: (1, 240), (1, 60), (1, 0)
    Tam giac vuong: (1, 240), (1, 60), (1, 120)
    Mã:
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define MAX 1000 // so phan tu dau vao
    
    
    int main() {
        int i, j, k, h, n, m; // bien vong lap
        int pos; // vi tri xet
        int flag; // co xet
    
    
        FILE *f; // con tro file
    
    
        // luu data dau vao
        struct polar
        {
            int r; // luu r dau vao
            int pi; // luu pi dau vao
            int flag; //
        } polar[MAX];
    
    
        // luu ket qua loc
        struct save{
            int r; // luu r
            int pi[MAX]; // luu pi khac
            int n; // so phan tu pi
        } save;
    
    
        /*
        doc data
        */
        f = fopen("input.text","rt"); // mo file
    
    
        fscanf(f, "%d", &n); // do so phan tu dong dau
    
    
        for (i = 0; i < n; i++) // doc va in du lieu ra man hinh
        {
            fscanf(f, "%d %d", &polar[i].r, &polar[i].pi); // doc du lieu vao struct
            polar[i].flag = 1; // dat co xet
            printf("(%d, %d)\n", polar[i].r, polar[i].pi); // in ra man hinh
        }
        fclose(f); // dong file
    
    
        /*
        loc cap r trung PI khac
        */
        pos = 0; // phan tu lam moc xet
    
    
        do
        {
            if (polar[pos].flag == 0) // da xet, bo qua vong nay
            {
                pos += 1;
                continue;
            }
    
    
            // co ghi nhay cach pos
            flag = 0;
    
    
            // luu phan tu lam moc
            save.r = polar[pos].r;
            save.pi[0] = polar[pos].pi;
            save.n = 0;
    
    
            // tim trung r
            for (j = pos + 1; j < n; j++)
            {
                if (polar[j].flag == 0) // bo qua neu da xet
                {
                    continue;
                }
                else // chua xet
                {
                    if (polar[j].r == save.r) // r trung
                    {
                        polar[j].flag = 0; // bat co da xet
    
    
                        if (polar[j].pi != save.pi[0]) // pi khac
                        {
                            save.pi[save.n + 1] = polar[j].pi; // luu pi vao save
                            save.n += 1; // tang so phan tu save
                        }
                    }
                    else // r khac
                    {
                        if (flag == 0) // ghi vi tri, bat co nhay pos lan dau
                        {
                            pos = j;
                            flag = 1;
                        }
                    }
                }
            }
    
    
            // cung r trung ma co 3 pi khac, loc dinh tam giac vuong hoac deu
            if (save.n + 1 > 2)
            {
                for(i = 0; i < save.n + 1; i++)
                {
                    for (k = i + 1; k < save.n + 1; k++)
                    {
                        // tam giac vuong
                        if (abs(save.pi[i] - save.pi[k]) == 180)
                        {
                            for (m = 0; m < save.n + 1; m++)
                            {
                                if ((m != i) && (m != k))
                                {
                                    printf("Tam giac vuong: (%d, %d), (%d, %d), (%d, %d)\n", save.r, save.pi[i], save.r, save.pi[k], save.r, save.pi[m]);
                                }
                            }
                        }
    
    
                        // tam giac deu
                        if (abs(save.pi[i] - save.pi[k]) == 120)
                        {
                            for (h = k + 1; h < save.n + 1; h++)
                            {
                                if (abs(save.pi[h] - save.pi[k]) == 120)
                                {
                                    printf("Tam giac deu: (%d, %d), (%d, %d), (%d, %d)\n", save.r, save.pi[i], save.r, save.pi[k], save.r, save.pi[h]);
                                }
                            }
                        }
                    }
                }
            }
    
    
            // khong nhay cach tang pos len 1
            if (flag == 0) pos += 1;
        } while (pos < n - 1);
    
    
        getch();
    }
    Còn bạn nào có thuật toán cao hơn thì cứ post nha (mình tự học lập trình chứ không qua trường lớp đâu, nói mấy công thức toán cao cấp cũng chịu, thuật toán tự nghĩ ra là chính, con người xử lý thế nào, cho máy xử lý thế đó, công đoạn nào lược bớt được thì rút ngắt thời gian xử lý, với mình đó gọi là tối ưu)

  14. #22
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 402126
    Giới tính: Nữ
    Bài gửi
    22

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Đây là code của em (trừ phần đầu struct là của thầy viết). Thầy khen viết như vầy mới chạy nhanh và tối ưu được.

    Mã:
    template<class T>
    struct Vector {
        T *a = 0;
        int n = 0, cap = 1;
    
        Vector():Vector(1) { }
    
        Vector(int N) {
            a = new T[N];
            cap = N;
        }
    
        ~Vector() {
            delete[] a;
            cap = n = 0;
        }
    
        void operator = (const Vector &another) {
            if (this == &another)
                return;
            cap = another.cap;
            n = another.n;
            delete[] a;
            a = new int[n];
            for (int i = 0; i < n; ++i)
                a[i] = another.a[i];
        }
    
        Vector(const Vector &another) {
            *this = another;
        }
    
        void push_back(int x) {
            if (n == cap) {
                cap *= 2;
                a = (T*)realloc(a, sizeof(int) * cap);
            }
            a[n++] = x;
        }
    };
    
    int triangles1() {
        Vector<int> *v = new Vector<int>[100001];
        int flag[400], N, r, theta;
    
        FILE *f = fopen(FI, "r");
        fscanf(f, "%d\n", &N);
    
        for (int i = 0; i < N; i++) {
            fscanf(f, "%d %d\n", &r, &theta);
            v[r].push_back(theta);
        }
        fclose(f);
    
        int mark = 0, ans = 0;
    
        for (int i = 1; i <= 100000; i++) {
            mark++;
            int m = v[i].n;
            for (int j = 0; j < m; j++) {
                int x = (v[i].a[j] + 180) % 360;
                if (flag[x] == mark)
                    ans += m - 2;
                int a = (v[i].a[j] + 120) % 360;
                int b = (a + 120) % 360;
                if (flag[a] == mark && flag[b] == mark)
                    ans++;
                flag[v[i].a[j]] = mark;
            }
        }
        delete[] v;
        return ans;
    }


    Code của bạn thì chắc em phải sửa lại để cho dễ xem:

    Mã:
    #define MAX 1000 // so phan tu dau vao
    
    int triangles2() {
        int i, j, k, h, n, m; // bien vong lap
        int pos; // vi tri xet
        int flag; // co xet
    
        int ans = 0;
    
        FILE *f; // con tro file
    
                 // luu data dau vao
        struct polar
        {
            int r; // luu r dau vao
            int pi; // luu pi dau vao
            int flag; //
        } polar[MAX];
    
        // luu ket qua loc
        struct save {
            int r; // luu r
            int pi[MAX]; // luu pi khac
            int n; // so phan tu pi
        } save;
    
        /*
        doc data
        */
        f = fopen(FI, "rt"); // mo file
    
        fscanf(f, "%d", &n); // do so phan tu dong dau
    
        for (i = 0; i < n; i++) // doc va in du lieu ra man hinh
        {
            fscanf(f, "%d %d", &polar[i].r, &polar[i].pi); // doc du lieu vao struct
            polar[i].flag = 1; // dat co xet
            //printf("(%d, %d)\n", polar[i].r, polar[i].pi); // in ra man hinh
        }
        fclose(f); // dong file
    
                   /*
                   loc cap r trung PI khac
                   */
        pos = 0; // phan tu lam moc xet
    
        do
        {
            if (polar[pos].flag == 0) // da xet, bo qua vong nay
            {
                pos += 1;
                continue;
            }
    
            // co ghi nhay cach pos
            flag = 0;
    
            // luu phan tu lam moc
            save.r = polar[pos].r;
            save.pi[0] = polar[pos].pi;
            save.n = 0;
    
            // tim trung r
            for (j = pos + 1; j < n; j++)
            {
                if (polar[j].flag == 0) // bo qua neu da xet
                {
                    continue;
                }
                else // chua xet
                {
                    if (polar[j].r == save.r) // r trung
                    {
                        polar[j].flag = 0; // bat co da xet
    
                        if (polar[j].pi != save.pi[0]) // pi khac
                        {
                            save.pi[save.n + 1] = polar[j].pi; // luu pi vao save
                            save.n += 1; // tang so phan tu save
                        }
                    }
                    else // r khac
                    {
                        if (flag == 0) // ghi vi tri, bat co nhay pos lan dau
                        {
                            pos = j;
                            flag = 1;
                        }
                    }
                }
            }
    
            // cung r trung ma co 3 pi khac, loc dinh tam giac vuong hoac deu
            if (save.n + 1 > 2)
            {
                for (i = 0; i < save.n + 1; i++)
                {
                    for (k = i + 1; k < save.n + 1; k++)
                    {
                        // tam giac vuong
                        if (abs(save.pi[i] - save.pi[k]) == 180)
                        {
                            for (m = 0; m < save.n + 1; m++)
                            {
                                if ((m != i) && (m != k))
                                {
                                    ++ans;
                                    //printf("Tam giac vuong: (%d, %d), (%d, %d), (%d, %d)\n", save.r, save.pi[i], save.r, save.pi[k], save.r, save.pi[m]);
                                }
                            }
                        }
    
                        // tam giac deu
                        if (abs(save.pi[i] - save.pi[k]) == 120)
                        {
                            for (h = k + 1; h < save.n + 1; h++)
                            {
                                if (abs(save.pi[h] - save.pi[k]) == 120)
                                {
                                    ++ans;
                                    //printf("Tam giac deu: (%d, %d), (%d, %d), (%d, %d)\n", save.r, save.pi[i], save.r, save.pi[k], save.r, save.pi[h]);
                                }
                            }
                        }
                    }
                }
            }
    
            // khong nhay cach tang pos len 1
            if (flag == 0) pos += 1;
        } while (pos < n - 1);
        return ans;
    }

  15. #23
    Ðến Từ
    Hà Nội
    Thành Viên Thứ: 358027
    Bài gửi
    1.681

    Reply: Hỏi về code phương trình bậc 2 bằng C

    Bạn có thể đưa cho thầy của bạn xem thuật toán nào tối ưu hiệu suất công việc hơn, chứ mình không động đến pascal từ lâu rồi, cũng không bằng không cấp dù có nói đúng cũng không ai tin (pascal mình học từ cấp 2 môn tin học)

    Chưa hiểu rõ cơ sở thuật toán của thầy bạn làm nên không cơ sở nói chính xác:

    Chỉ nói điều mình dễ nhìn thấy trong code bạn luôn thực hiện 100000 vòng lặp chính (chưa kể vòng lặp con bên trong)

    Còn của mình sẽ rút ngắn công việc dựa vào dư liệu nhập (nó không phải code quy chuẩn thành thuật toán tổng quát: tìm kiếm, liệt kệ, ...), chứ không phải liệt kệ 100000 giá trị r

    n điểm có giá trị r hoàn toàn khác nhau thì xét n + (n - 1) + (n - 2) ... + 1 vòng lặp

    nếu có điểm r trùng giá trị với giá trị r xét làm mốc => thì các vòng lặp (n - x) nó của các giá r đã xét trùng sẽ được bỏ quả => càng nhiều r trùng giá trị thì số lượng vòng lặp được rút gọn càng lớn => công việc rút ngắn càng nhanh

  16. #24
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    881

    Reply: Hỏi về code phương trình bậc 2 bằng C

    @LanSG9x: Bài thầy cho bạn là 1 cái gift. Vì dữ liệu quá nhỏ n < 1000 nên tối ưu ko cần nhiều mà vẫn chạy nhanh. Cách làm của 'triangles1' chỉ thể hiện ưu thế khi n lớn thôi. Mình đoán n tới 20000 thì 'triangles1' sẽ bắt đầu nhanh hơn 'triangles2'.

    'triangles1' chỉ có độ phức tạp O(n) thôi. Thật ra nó là O(10^5 + n). Lưu ý đây là phép cộng. Bạn xem xét đoạn code lại sẽ thấy 2 vòng loop chỉ chạy 10^5 + n lần. Bạn đừng bị đánh lừa. :-) Bởi vì lúc nào cũng phải chạy 10^5 nên bạn có thể xem như là overhead fee nên khi dữ liệu nhỏ nó luôn luôn chạy chậm.

    Ý tưởng của 'triangles1' là dựa trên Hough transform (tìm số đường thẳng đi qua ít nhất k điểm trong số n điểm cho trước), và nó chỉ hiệu quả với tọa độ nguyên. Bài này giải thích hơi dài dòng và rất khó hiểu.
    - Giống như bạn gunshot9x đã nhận xét rất đúng đắn, chúng ta phải quét dựa vào bán kính. v[i] là những điểm (góc) có bán kính là i.
    - Về tam giác vuông (cái mà +180), bạn có thể hiểu đại khái thế này: nếu 2 điểm tạo thành đg` kính đi qua gốc O thì tất cả những điểm nào nằm trên vòng tròn qua 2 điểm đó phải tạo thành tam giác vuông. Nếu có m điểm thì sẽ có m-2 tam giác vuông (vì trừ đi 2 đầu mút cố định).
    - Tương tự cho cái +60 và +120.
    - mark (cái này hơi thừa, dùng i cũng đc mà). Vòng lặp nó vừa đi vừa đánh dấu, nhưng kết quả chỉ đc tính chỉ sau khi đi qua. Cho đơn giản, giả sử ta chỉ đếm tam giác vuông. Với bán kính i, ta xét v[i] (những điểm cách tâm O là i)

    - Khi qua A, nhìn qua E (+180), chưa thấy gì vì E chưa đc đánh dấu (flag[A + 180] = 0). Đánh dấu A.
    - Khi qua B, nhìn qua F (+180), chưa thấy gì vì F chưa đc đánh dấu (flag[B + 180] = 0). Đánh dấu B.
    - Khi qua C, nhìn ko thấy điểm nào (flag[C + 180] = 0). Đánh dấu C.
    - Khi qua D, nhìn qua G (+180), chưa thấy gì vì G chưa đc đánh dấu (flag[D + 180] = 0). Đánh dấu D.
    - Khi qua E, nhìn qua A (+180), thấy A, như vậy số tam giác vuông nhận AE là cạnh huyền là 6 (tổng số điểm trừ 2). Đánh dấu E.
    - Khi qua F, nhìn qua B (+180), thấy B, như vậy số tam giác vuông nhận FB là cạnh huyền là 6 (tổng số điểm trừ 2). Đánh dấu F.
    - Cuối cùng là G tương tự có 6.

    'triangles2' thì độ phức tạp ít nhất cũng O(n^2). Vì 'triangles2' chặn hết những trường hợp (cái hay của 'triangles2' là ở phép chặn) nên nó vẫn nhanh. Tuy nhiên, khi n lớn (tới chục nghìn) thì yếu điểm thuật toán O(n^2) ~10^8 bắt đầu thể hiện ra!!!

    Nói khó hiểu mọi người nhìn thời gian chạy là biết ngay.



    Test của mình là full vòng tròn 0-359 với R chạy tăng dần.

    @gunshot9x: Trong computer science, 99.99% các bài đều giải đc nếu thời gian và tài nguyên không là vấn đề. Cái chính là làm sao cho nhanh, đó mới là thuật toán. Nếu cái người ta nghĩ ra hay hơn mình thì mình nên học hỏi và ghi nhớ. Đây là cách tôn trọng những người đã dày công nghiên cứu (intellectual property). Ko phải họ chỉ là nghĩ ra mà còn phải chứng minh: tại sao đúng, thời gian chạy ra sao.

  17. 3 thành viên đã cảm ơn tengiday:


Trang 2/3 Đầu 123 cuối