30/09/2018, 20:35

Phân tích n! thành thừa số nguyên tố

Giúp em bài này với!!!
Phân tích N! ra thừa số nguyên tố. (số N có thể lớn hoặc rất lớn )
N! =2^x2 * 3^x3 p^xp *…
Với N,p nhập từ bàn phím. (p là số nguyên tố).
Xuất ra màn hình: xp. (xp là số lần xuất hiện của p)
VD: N=4, p=2
4! = 2^3 * 3^1
==> xp = 3

Đây là code tính giai thừa em mò mẫm đc, còn phần tìm ra xp thì em chịu.

int i, j, n, so;
	unsigned long sl;
	unsigned sn;
	int a[MAX];

	printf("Chuong trinh tinh giai thua so lon.
 Nhap n: ");
	scanf_s("%d", &n);
	a[0] = 1;
	sn = 0;
	so = 1;

	for (i = 1; i <= n; ++i)
	{
		sn = 0l;
		for (j = 0; j<so; ++j)
		{
			sl = i*a[j] + sn;
			a[j] = sl % 10000;
			sn = sl / 10000;
		}
		if (sn)
			a[so++] = sn;
	}

	for (j = so - 1; j >= 0; j--)
		printf("%d", a[j]);
	printf("
");
Gió viết 22:38 ngày 30/09/2018

Nếu chỉ cần đếm xp thì có một công thức tính như sau f(n,p)= f(n/p,p)*p +n/p. Công thức này bạn có thể tìm hiểu về bài toán đếm số 0 tận cùng của n! trong hệ cơ số p.
Còn phân tích toàn bộ ra thừa số nguyên tố thì bạn nên dùng sàng nguyên tố nó sẽ giúp làm nhanh hơn

Trần Ngọc Khải viết 22:49 ngày 30/09/2018

Cảm ơn bạn. Bạn có thể giải thích công thức đấy rõ hơn đc k?

Chu Minh Ngọc viết 22:37 ngày 30/09/2018

Bách Khoa TPHCM à b :))

Trần Ngọc Khải viết 22:38 ngày 30/09/2018

Bách Khoa TPHCM à b :))

Đề của bên đấy á bạn :))) thấy hay hay nên làm thử

Chu Minh Ngọc viết 22:48 ngày 30/09/2018

thằng bạn cùng phòng cũng hỏi mình mà thấy 999.999.999! nên đang ngán

Trần Ngọc Khải viết 22:43 ngày 30/09/2018

mình hỏi đc phương pháp rồi và tối nay đang định chiến thử với nó lại

Tobi the Terrible viết 22:46 ngày 30/09/2018

Bài tập kiểu này bạn có thể tìm trên projecteuler.net. Theo mình không nên tính giai thừa rồi lại chia ra thừa số nguyên tố, vì làm vậy có thể làm tràn bộ nhớ trong bước tính giai thừa.

Thay vào đó, nên phân tích từng thừa số trong giai thừa ra thừa số nguyên tố trước. Rồi cộng bậc của tất cả các thừa số nguyên tố lại

Một số tự nhiên bất kì chỉ có đúng một tổ hợp thừa số nguyên tố. Cách phân tích 1 số K ra thừa số nguyên tố. Bạn có thể tham khảo thuật toán bên dưới. Cách này dựa theo phương pháp “Sàng Erathosthenes”:

k = 2354353454;
for (int i = 2; i*i <= k; i++) {
    if (k % i== 0) {
       k /=i; 
       i--;
    }
}

Bạn có thể đọc thêm ở đây:

en.wikipedia.org

Prime number

A prime number (or a prime) is a natural number greater than 1 that cannot be formed by multiplying two smaller natural numbers. A natural number greater than 1 that is not prime is called a composite number. For example, 5 is prime because the only ways of writing it as a product, 1 × 5 or 5 × 1, involve 5 itself. However, 6 is composite because it is the product of two numbers (2 × 3) that are both smaller than 6. Primes are central in number theory because of the fundamental theorem of arit...


vi.wikipedia.org

Sàng Eratosthenes

Sàng Eratosthenes là một thuật giải toán cổ xưa để tìm các số nguyên tố nhỏ hơn 100. Thuật toán này do nhà toán học cổ Hy Lạp là Eratosthenes (Ơ-ra-tô-xten) "phát minh" ra. Ban đầu, nhà toán học Eratosthenes sau khi tìm ra thuật toán, đã lấy lá cọ và ghi tất cả các số từ 2 cho đến 100. Ông đã chọc thủng các hợp số và giữ nguyên các số nguyên tố. Bảng số nguyên tố còn lại trông rất giống một cái sàng. Do đó, nó có tên là sàng Eratosthenes.[cần dẫn nguồn] Để tìm các số nguyên tố nhỏ hơn hoặc bằng...

viết 22:46 ngày 30/09/2018

phân tích giai thừa của từng số từ 2 tới n, rồi cộng số mũ tương ứng của các thừa số nguyên tố đó lại

ví dụ:
10! = 1.2.3.4.5.6.7.8.9.10
= 2.3.4.5.6.7.8.9.10 (bỏ qua số 1 vì nó ko có thừa số nguyên tố nào)
= (21)(31)(22)(51)(21 31)(71)(23)(32)(21 51)
= 21+2+1+3+1 31+1+2 51+1 71
= 28 34 52 71

nếu chỉ tính số mũ của 1 thừa số nguyên tố nhất định thì còn dễ hơn nữa. Ko cần phân tích m (1 < m <= n) thành thừa số nguyên tố mà chỉ cần phân tích m = pq k và bỏ qua k

Trần Ngọc Khải viết 22:44 ngày 30/09/2018

Cảm ơn bạn @tntxtnt và bạn @Tobi đã chỉ cho mình phương pháp hay để mình làm lại thử với cách của hai bạn.

Hala Madrid Hữu Ước viết 22:44 ngày 30/09/2018

tính giai thừa số lớn thì dùng xâu, giả sử tính 1000 giai thừa thì mảng k thể chứa hết được => nên bắt buộc dùng xâu

HK boy viết 22:51 ngày 30/09/2018
  • Có cách cài bignum dùng mảng.

  • 1000! có 2568 chữ số, nếu như bạn cài bignum bằng string thì độ phức tạp là O(n * log(n!)). n = 1000 thì tính ngót nghét 2 triệu phép tính, rồi lại phân tích ra thừa số nguyên tố, có lẽ hơi căng.

  • Bài toán là phân tích giai thừa thành thừa số nguyên tố, sao bạn không làm cách khôn ngoan hơn là phân tích từng số trong giai thừa thành thừa số nguyên tố rồi cộng các số mũ lại?


P/s: Bạn có vẻ thích đào mộ nhỉ

rogp10 viết 22:36 ngày 30/09/2018

Đề bài không yêu cầu tính n! đâu thớt đang quáng thôi.


Bài này 1 for và giải thích như sau:

  • Để trích lấy thừa số p ứng với n, ta liên tục chia n cho p cho đến khi dư.
  • Trải ra từ 1 đến n, có n DIV p số chia hết cho p. Ta có n DIV p * p + r = n (r >= 0), nên liệt kê được: 1p, 2p, …, n DIV p
  • Tương tự, có n DIV p^2 số chia hết cho p^2. Mà n DIV p DIV p = n DIV p^2, nên 1 for thôi.
Bài liên quan
0