Tìm ước lẻ của một số c++

Trong phần này, chúng ta sẽ xem cách chúng ta có thể tính tổng tất cả các thừa số nguyên tố lẻ của một số một cách hiệu quả. Có một số n = 1092, ta phải lấy cả thừa số này. Các thừa số nguyên tố của 1092 là 2, 2, 3, 7, 13. Tổng tất cả các thừa số lẻ là 3+7+13 = 23. Để giải quyết vấn đề này, chúng ta phải tuân theo quy tắc này -

  • Khi một số chia hết cho 2 thì bỏ qua thừa số đó và chia nhiều lần cho 2

  • Bây giờ số phải là số lẻ. Bây giờ bắt đầu từ 3 đến căn bậc hai của số, nếu số đó chia hết cho giá trị hiện tại thì hãy cộng thừa số với tổng và thay đổi số bằng cách chia cho số hiện tại rồi tiếp tục

    Nếu vấn đề thực sự đúng như bạn mô tả, bạn có thể cải thiện hiệu suất theo nhiều cách, chỉ một trong số các cách dưới đây, nhưng trước tiên bạn phải hiểu lý thuyết đằng sau những gì bạn đang cố gắng thực hiện

    Số nguyên có số ước lẻ luôn là số chính phương. Cho một số

    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    0, nếu
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    1 là một ước số thì phải có một số
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    2 tương ứng sao cho
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    3 đúng. Họ luôn đi theo cặp. Ngoại lệ là một hình vuông hoàn hảo. Trong trường hợp đó, số của họ có một số ước số
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    4 sao cho
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    5 và
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    4 chỉ được tính là một ước số. Do đó
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    0 có số ước lẻ

    Vậy điều này giúp ích như thế nào? . Nhưng chúng ta vừa chỉ ra rằng chỉ những hình vuông hoàn hảo mới có tính chất như vậy. Vì vậy, những gì câu hỏi đó đang thực sự yêu cầu là

    Tìm số bình phương hoàn hảo giữa hai số nguyên

    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    2 và
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    3

    Một thuật toán như vậy chỉ đơn giản là thế này

    • Bắt đầu với
      5 
      1 2 
      10 100
      100 1000
      500 2500
      1 262144
      
      2 lấy căn bậc hai dấu phẩy động của số kiểm tra
    • Bình phương căn sau khi chuyển đổi sang kiểu số nguyên thích hợp
    • Nếu bình phương của căn dẫn đến số ban đầu, bạn có một số chính phương. Dừng vòng lặp
    • Nếu không, hãy tăng số kiểm tra của bạn và thử lại. Dừng lại nếu bạn vượt qua
      5 
      1 2 
      10 100
      100 1000
      500 2500
      1 262144
      
      3 hoặc tìm thấy một hình vuông hoàn hảo, tùy theo điều kiện nào đến trước

    Nếu bạn không tìm thấy hình vuông hoàn hảo, câu trả lời là không và bạn đã hoàn thành. Nếu bạn tìm thấy một hình vuông hoàn hảo, bạn sẽ không cần phải lặp tăng dần trên

    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    2 và
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    3 nữa. Bạn có một điểm bắt đầu (một căn hoàn hảo), và bây giờ bạn sẽ lặp bằng cách tăng dần căn đó cho đến khi bình phương của nó vượt quá
    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    3. Điều này sẽ làm giảm đáng kể số lần lặp lại

    Trong đoạn mã dưới đây

    • 1
      7
      22
      28
      512
      
      1. số lượng bài kiểm tra
    • 5 
      1 2 
      10 100
      100 1000
      500 2500
      1 262144
      
      2. số đầu tiên trong một chuỗi thử nghiệm
    • 5 
      1 2 
      10 100
      100 1000
      500 2500
      1 262144
      
      3. số cuối cùng trong một chuỗi thử nghiệm
    • 5 
      1 2 
      10 100
      100 1000
      500 2500
      1 262144
      
      0. số lượng các giá trị chia lẻ giữa
      5 
      1 2 
      10 100
      100 1000
      500 2500
      1 262144
      
      2 và bao gồm cả
      5 
      1 2 
      10 100
      100 1000
      500 2500
      1 262144
      
      3
    • 1
      7
      22
      28
      512
      
      7. Căn bậc hai đang chạy của các vòng khám phá của chúng tôi

    Mã số

    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    5

    Đầu vào

    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    

    đầu ra

    1
    7
    22
    28
    512
    

    Màn biểu diễn

    Mã này hoạt động tốt], xem xét nó có ít như thế nào. Việc tháo gỡ kết quả bằng cách sử dụng clang 3. 9. 1 với

    1
    7
    22
    28
    512
    
    8 là đáng nể

    5 
    1 2 
    10 100
    100 1000
    500 2500
    1 262144
    
    9

    Đó là nó. Nó có thể được thực hiện nhanh hơn nữa, nhưng miễn là nó đáp ứng nhu cầu về hiệu suất của bạn, thì có lẽ bạn không cần phải nỗ lực nhiều hơn (vì vậy tôi hy vọng là như vậy) Thông thường các câu hỏi về ước số lẻ cũng yêu cầu một số có giá trị thấp nhất (hoặc cao nhất) . Câu hỏi bạn nêu không hỏi điều đó, và do đó vấn đề giảm xuống rất tốt

    Số nào có số ước lẻ?

    Số bình phương có số thừa số lẻ. ví dụ. 1, 4, 9, 16, 25, 36,… Nếu nhân một số nguyên với chính nó ta được một số chính phương.

    Các ước lẻ của 360 là gì?

    Giải pháp chi tiết . ∴ tổng tất cả các ước riêng lẻ của 360 là 78. 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 18, 20, 24, 30, 36, 40, 45, 60, 72, 90, 120, 180, 360. ∴ the sum of all odd proper divisors of 360 is 78.