01/10/2018, 15:55

Cách phân tích một số thành thừa số nguyên tố nhanh

mình đang viết chương trình phân tích một số thành thừa số nguyên tố và số mũ tương ứng.
VD:
10
2 1
5 1

#include<iostream> 
using namespace std; 
int main(){ 
	int i=2,x=0; 
	long long n;  
	cin >> n; 
	while(1){ 
		if(n%i==0){ 
			n=n/i;
			x++;
		} 
		else {
			if(x!=0) cout<<i<<" "<<x<<"
";
			x=0;
			i++;
			if(n==1) break;
		} 
	} 
	return 0; 
}

cho mình hỏi là còn cách nào nhanh hơn không ạ??

HK boy viết 17:55 ngày 01/10/2018

Dùng sàng Eratosthenes.

http://codeforces.com/blog/entry/7262

Trần Hoàn viết 18:05 ngày 01/10/2018
for (int i = 2; i <= n; i += 1)
{
	int c = 0;
	while (n % i == 0)
	{
		n /= i;
		c += 1;
	}
	if (c > 0)
		cout << i << " "<< c << endl;
}

Code này không chắc là nhanh hơn nhưng mà sáng sủa hơn code của bạn

Còn cách nhanh nhất đương nhiên là dùng sàng Eratosthenes, nhưng quá trình thiết lập sàng thì lâu, nên chỉ hiệu quả nếu thiết lập xong lưu thành file và dùng nhiều lần.

Bac Nguyen viết 17:57 ngày 01/10/2018

k ổn b ạ . nó ra k đúng yêu cầu

HK boy viết 17:57 ngày 01/10/2018

Mình đưa link đó cho bạn để bạn đọc rồi code lại và cải tiến chứ có phải là chép nguyên xi đâu @@

Trần Hoàn viết 18:06 ngày 01/10/2018

Ra không đúng yêu cầu là thế nào? Mình đã test cẩn thận rồi đó

Bac Nguyen viết 17:56 ngày 01/10/2018

không bạn ơi. đoạn code của bạn Trần Hoàn cơ bn ạ

Bac Nguyen viết 18:03 ngày 01/10/2018

à vẫn ra kết quả nhưng vẫn bị time limited bạn ạ

Trần Hoàn viết 18:01 ngày 01/10/2018

Ồ, có bộ đo thời gian à. Nếu là web thì bạn cho mình link mình làm thử với.

Bac Nguyen viết 17:59 ngày 01/10/2018

http://www.spoj.com/PTIT/status/ đây b ơi

rogp10 viết 18:02 ngày 01/10/2018

Đâu cần, tự khắc số chia sẽ nguyên tố cái quan trọng hơn là i <= sqrt(n)

Bac Nguyen viết 18:03 ngày 01/10/2018

bạn nói rõ hơn được k??

rogp10 viết 18:02 ngày 01/10/2018

Mình giải thích ý 2 trước: Do nếu i chia hết n thì n/i chia hết n, nên ta thu được một cặp có số lớn số bé. Vậy khi i <= n/i thì i^2 <= n.
Ý 1: Sau bước lặp i=j, n không chia hết cho j (nếu có thì vẫn còn trong vòng while bên trong). Vậy theo quy nạp, n không chia hết cho 2…j, vậy nếu j+1 chia hết n thì j+1 không thể chia hết cho bất cứ số nào trong [2…j] được nữa (nếu có thì hóa ra là chưa chia cho hết?), đây là định nghĩa của số nguyên tố

Thực ra từ j (lẻ) có thể nhảy lên j+2 (cũng lẻ), hay dùng bước nhịp 2-4 luôn…

Bac Nguyen viết 17:56 ngày 01/10/2018

vậy bạn xem code này có chỗ nào chưa tối ưu không??

#include<iostream> 
using namespace std; 
int main(){ 
	int i=2,x=0; 
	long long n;  
	cin >> n; 
	while(1){ 
		if(n%i==0){ 
			n=n/i;
			x++;
		} 
		else {
			if(x!=0) cout<<i<<" "<<x<<"\n";
			x=0;
			if(i%2!=0) i=i+2;
			else i++;
			if(n==1) break;
		} 
	} 
	return 0; 
}
Bài liên quan
0