Phân tích ra thừa số nguyên tố

I. Các kiến thức cần nhớ

Phân tích một số ra thừa số nguyên tố

Ví dụ: Số \(76\) được phân tích như sau:

Phân tích ra thừa số nguyên tố

Như vậy \(76 = {2^2}.19\)

Nhận xét:

* Cách tính số lượng các ước của một số $m\left( {m > 1} \right)$:  ta xét dạng phân tích của số m ra thừa số nguyên tố:

Nếu $m = {a^x}$ thì $m$  có $x + 1$ ước

Nếu $m = {a^x}.{b^y}$ thì $m$  có $\left( {x + 1} \right)\left( {y + 1} \right)$ ước.

Nếu $m = {a^x}.{b^y}.{c^z}$ thì $m$  có $\left( {x + 1} \right)\left( {y + 1} \right)\left( {z + 1} \right)$ ước.

II. Các dạng toán thường gặp

 Dạng 1: Phân tích các số cho trước ra thừa số nguyên tố

Phương pháp

Ta thường  phân tích một số tự nhiên $n\left( {n > 1} \right)$ ra thừa số nguyên tố bằng cách phân tích theo hàng dọc.

Dạng 2 : Ứng dụng phân tích một số ra thừa số nguyên tố để tìm các ước của số đó.

Phương pháp

+ Phân tích số cho trước ra thừa số nguyên tố.

+ Chú ý rằng nếu $c = a.b$  thì $a$  và $b$ là hai ước của $c.$

Nhớ lại rằng: $a = b.q$\( \Leftrightarrow a \vdots b \Leftrightarrow a \in B\left( b \right)\) và \(b \in \)Ư\(\left( a \right)\) $(a,b,q \in N,b \ne 0)$

Dạng 3: Bài toán đưa về việc phân tích một số ra thừa số nguyên tố

Phương pháp:

 Phân tích đề bài, đưa về việc tìm ước của một số cho trước bằng cách phân tích số đó ra thừa số nguyên tố.

This entry is part 21 of 69 in the series Học C Không Khó

82 / 100

Bài toán phân tích thừa số nguyên tố, hay nói đầy đủ hơn là phân tích số tự nhiên N thành tích các thừa số nguyên tố là một bài tập lập trình cơ bản thường được sử dụng trong các bài thi nhập môn lập trình. Trong bài chia sẻ này, Lập trình không khó sẽ cùng các bạn đi tìm hiểu và giải quyết bài toán phân tích thừa số nguyên tố này nhé.

1. Đề bài phân tích thừa số nguyên tố

Nếu bạn để ý tên bài toán, “phân tích thừa số nguyên tố” đã mang sẵn ý nghĩa của bài toán. “thừa số” có ở trong câu: muốn tìm một thừa số chưa biết, ta lấy tích chia cho thừa số đã biết ^^; Chẳng hạn, 5 và 4 là các thừa số trong phép nhân 5×4 = 20. “nguyên tố” chỉ rằng các thừa số sẽ luôn là số nguyên tố, bạn thử mà xem!

Như vậy, để dễ hình dung, chúng ta sẽ có những ví dụ sau:

  • 8 = 23
  • 100 = 22 * 5
  • 999 = 33 * 37

Vậy mục tiêu của các bạn là: Nhập vào một số nguyên dương N, hãy phân tích số N thành tích các thừa số nguyên tố(chính là phần phía sau dấu bằng).

2. Ý tưởng giải bài toán phân tích thừa số nguyên tố

Rất đơn giản, giả sử bạn cần phân tích số N thành tích các thừa số nguyên tố. Bạn chỉ cần thực hiện chia số N cho các số nguyên tố trong đoạn [2; N]. Với mỗi số nguyên tố đó, đếm số lần mà số N chia hết. Tất nhiên, sau mỗi lần chia cho số i, số N của chúng ta sẽ giảm đi i lần.

Một ví dụ sinh động hơn, xét N = 300

300 2
150 2
75 5
15 5
3 3
1

Khi đó, 300 = 22 * 52 * 3. Nhưng không phải khi N = 1 chúng ta sẽ dừng đâu nhé. Xét một ví dụ khác xem sao:

Giả sử N = 999, khi N chỉ còn 37, mà 37 là số nguyên tố, nên ta dừng quá trình chia.

999 3
333 3
111 3
37 37
1

Khi đó, 999 = 33 * 37.

Nói một cách tổng quát hóa hơn, bạn sẽ dừng quá trình chia khi số chia lớn hơn N. Nói cách khác, chừng nào N chưa bằng 1, chúng ta tiếp tục quá trình chia.

3. Code phân tích thừa số nguyên tố

Lời giải triển khai với ngôn ngữ C:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include

int main(){

    int n;

    printf("\nNhap n = ");

    scanf("%d", &n);

    int dem;

    for(int i = 2; i <= n; i++){

        dem = 0;

        while(n % i == 0){

            ++dem;

            n /= i;

        }

        if(dem){

            if(dem > 1) printf("%d^%d", i, dem);

            else printf("%d", i);

            if(n > i){

                printf(" * ");

            }

        }

    }

}

Cũng với ý tưởng này, nhưng code bằng C++ sẽ như sau:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#include

using namespace std;

int main(){

    int n;

    cout << "\nNhap n = ";

    cin >> n;

    int dem;

    for(int i = 2; i <= n; i++){

        dem = 0;

        while(n % i == 0){

            ++dem;

            n /= i;

        }

        if(dem){

            cout << i;

            if(dem > 1) cout << "^" << dem;

            if(n > i){

                cout << " * ";

            }

        }

    }

}

Cả 2 code trên khi chạy sẽ có output như nhau, đây là một kết quả chạy thử:

Nếu bạn biết về cấu trúc từ điển. Bạn có thể sử dụng chúng để đếm và lưu giữ lại để phục vụ khi cần về sau. Với cách này, bạn có thể sử dụng chỉ số mảng để đếm: Chẳng hạn như số 126, mảng đếm là mảng a, khi đó: a[2] = 1, a[3] = 2, a[7] = 1. Tuy nhiên, cách này có hạn chế là với số N lớn, sẽ tốn rất nhiều bộ nhớ.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#include

using namespace std;

const int MAX = 10000;

int dem[MAX];

int main(){

    int N;

    cout << "\nNhap n = ";

    cin >> N;

    int n = N; // Tao ban sao cua N

    if(n > MAX){

        printf("Ban nhap so lon hon %d", MAX);

        return 0;

    }

    for(int i = 0; i <= n; i++) dem[i] = 0;

    for(int i = 2; i <= n; i++){

        while(n % i == 0){

            ++dem[i];

            n /= i;

        }

    }

    for(int i = 0; i <= N; i++){

        if(dem[i]){

            cout << i << " ^ " << dem[i] << "\n";

        }

    }

}

Chạy thử với N = 999 xem sao:

Như vậy, 999 = 3^3 * 37.

Một cách tối ưu hơn và thuận tiện hơn là sử dụng cấu trúc map trong C++. Chúng ta có thể code như sau:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include

using namespace std;

#include

int main(){

    int N;

    cout << "\nNhap n = ";

    cin >> N;

    map<int, int> m;

    for(int i = 2; i <= N; i++){

        while(N % i == 0){

            m[i]++;

            N /= i;

        }

    }

    for(auto it : m){

        cout << it.first << " " << it.second << "\n";

    }

}

Lưu ý: Lời giải này sử dụng biến auto chỉ có trong C++ 11 trở lên. Nếu bạn muốn chạy được thì cần thêm flag: std=c++11.

g++ -std=c++11 your_file.cpp -o your_program

Hoặc nếu bạn dùng Dev C++, hãy vào Tools -> Compile Options và chọn như ảnh sau:

Phân tích ra thừa số nguyên tố
Cài đặt C++11 cho Dev C++

Như vậy, tôi đã hoàn thành bài chia sẻ phân tích thừa số nguyên tố này. Hi vọng rằng các bạn đã có được những kiến thức thật bổ ích. Mọi thắc mắc, hãy để lại tại mục bình luận, tôi sẽ giúp bạn những gì có thể.

> Tham gia forum Lập Trình Không Khó để không bỏ lỡ những bài viết mới nhất của admin nhé.