Nhập N>2.Viết N dưới dạng tích các thừa số nguyên tố

ukm : thuật toán thì đơn giản thôi …
trước tiên muốn phân tích số này thì cần tìm các số nguyên tố là ước của nó bằng cách sau :
1/ bạn sẽ chạy vòng lặp từ i từ 2 đến n .
2/ nếu mà i là số nguyên tố ( tức là bạn sẽ dùng hàm kiểm tra xem i có phải là snt hay ko ) nếu phải thì bạn sẽ lấy n/i nếu mà n chia hết cho i thì ghi nhận i vào 1 mảng … sau đó ta tiếp tục chia đến khi nào chia mà dư thì ta dừng lại tăng i lên 1 đơn vị …
3/ thực hiện vòng lặp đó đến khi nào i = n thì stop … sau đó in kết quả ra màn hình từ cái mảng đã lưu kết quả :slight_smile:

1 Like

quên mất là bạn phải cập nhật lại n nhá … sau mỗi lần chia n = n/i đó

Nhưng mình học ở trường,giảng viên yêu cầu không dùng mảng.

ukm vay ban dung stack … cho chut minh se code cho cau

#include <iostream>
#include <stack>
#include <algorithm>
#define For(i,a,b) for (int i = a;i<b;i++)
using namespace std;
struct number
{
	int so_bi_chia;
	int so_nguyen_to;
};
bool kiemtra(int k)
{
	if(k == 2) return true;
	else
		For(i,2,k)
	{
		if (k % i == 0) return false;
	}
	return true;
}
int main()
{
	int n;
	cout << "nhap n = ";
	cin >> n;
	cout << endl;
	number test;
	stack <number> str;
	test.so_bi_chia = n;
	test.so_nguyen_to = 0;
	str.push(test);
	int i = 2;
	For(i,2,n+1)
	{
		if (kiemtra(i) == true)
		{
			while (test.so_bi_chia != 1)
			{
				if (test.so_bi_chia % i == 0)
				{
					test.so_bi_chia = test.so_bi_chia / i;
					test.so_nguyen_to = i;
					str.push(test);
				}
				else break;
			}
		}
	}
	while (str.size() != 2)
	{
		cout << str.top().so_nguyen_to << "*";
		str.pop();
	}
	cout << str.top().so_nguyen_to << endl;
	system("pause");
	return 0;
}
1 Like

Bạn @BatdangthucD xem bài viết này rồi sửa lại code của bạn cho rõ ràng nhé :blush: Cách post Code dùng Markdown trong Category Programming

quen mat copi ca 2 doan code … cai topic nay bất tiện kinh … chả biết sửa chỗ nào … hài thà lên fb còn tiện hơn

Bạn bấm vào nút hình cây viết để sửa bài của bạn. Mình sửa cho bạn luôn rồi đó. Bạn bấm vào Edit để xem mình đã sửa những gì để lần sau post code lên được rõ ràng hơn. @BatdangthucD

tai sao lại ko có trình tự động dàn đoạn code và sắp xếp như trong các trình biên dịch vậy … bất tiện quá

sao ad ko việt hóa tất cả topic đi … chứ cứ có tiếng anh vào khó dùng …

Thank you ve doan code cua ban.

2 Likes

Vì chúng ta là lập trình viên. Ngôn ngữ quốc tế cho lập trình viên là tiếng Anh, không phải tiếng Việt. Không phải mình sính ngoại đâu, mà chúng ta bắt buộc phải sử dụng tiếng Anh cho quen đi. Nếu bạn không thể sử dụng tiếng Anh thì con đường lập trình phía trước chông gai lắm đấy.

Vì forum là diễn đàn thảo luận, không phải là trình biên dịch. Khi bạn viết một bài thơ vào trong trình biên dịch thì nó cũng báo lỗi giống như khi bạn viết code vào forum , forum không hiểu được.

Nhưng cũng có cách khác, đó là dùng markdown để báo cho forum biết đây là code, hãy hiển thị màu lên.

Nếu bạn chịu để ý một chút, bạn sẽ thấy cách sửa bài viết, cách hiển thị màu cho code. Lịch sử thay đổi của một bài viết. Nhiều tính năng mà FB không có.

Có ba điểm mà Đạt thấy bạn nên thay đổi

  • Để ý vào nhiều chi tiết. Những lập trình viên giỏi họ thấy những điều người bình thường không thấy.
  • Giảm bớt dùng Facebook. Facebook giết thời gian của bạn nhiều hơn đem lại cho bạn kiến thức.
  • Mình thấy bạn chịu khó học lập trình, nhưng bạn chưa chịu khó đọc hướng dẫn http://daynhauhoc.com/c/meta
2 Likes

Diễn đàn này là 1 diễn đàn kiểu mới. Có rất nhiều tính năng, tiện hơn với diễn đàn cũ , cái " bất tiện " ở đây là việc không chịu tìm hiểu chứ không phải diễn đàn " bất tiện " .

Chúng ta đang sử dụng một diễn đàn kiểu mới. Chúng ta đang là người đi trước người khác, vì thế chúng ta phải tìm hiểu nó :smile:

2 Likes
#include<math.h>
#include<iostream>
int main()
{
    int i,n;
    std::cout<<"\nEnter n:";
    std::cin>>n;
    std::cout<<n<<" = ";
    for(i=2;i<=n;i++){
        while(n%i==0){
            if(n==i) std::cout<<i;
            else std::cout<<i<<" * ";
            n=n/i;
        }
    } 
}
2 Likes

Bổ sung thêm chỗ kiểm tra i là số nguyên tố nữa bạn ơi.

1 Like

Không cần kiểm tra vì i đúng luôn là số nguyên tố

2 Likes

@Is2IT Câu này Ducky giải thích rõ hơn đi :smile: Hồi trước có học cái này rồi, mà giờ quên hết trơn, quê quá. Mới search lại thì ra cái này.

  • Nếu n là số nguyên tố, nó chỉ chia hết cho chính nó
  • Nếu n không phải số nguyên tố, thì xem chứng minh của Euclid http://goo.gl/tjLyat

Mấy bài này hay đấy :smile:

2 Likes

“vậy mỗi số nguyên lớn hơn một chỉ có một biểu diễn duy nhất dưới dạng tích thừa số nguyên tố (không kể đến thứ tự các thừa số).”

Thì ra là vậy.Giờ e mới hiểu. hix

Mấy cái này học cho vui, nếu mình không đi nghiên cứu toán, giải thuật, mã hóa tá lả. Nhưng biết để mai mốt đi theo cũng hay.

1 Like

Mình cho chạy vòng for từ 2 đến n.

for(i=2;i<=n;i++){
        while(n%i==0){
            if(n==i) std::cout<<i;
            else std::cout<<i<<" * ";
            n=n/i;
        }
}

Trong for cho 1 vòng while và in ra tất cả những số mà n chia hết chạy từ i=2.
Bạn sẽ thấy là nó sẽ lấy n chia cho 2 đến khi nào không chia hết được nữa thì thôi, mỗi lần n%2 ==0 lại in ra số 2 (2 là số nguyên tố).Sau đó nhảy lên 3 bỏ qua 4 nhảy lên 5 …
Mỗi vòng while n = n/i;
Cứ như thế với 3 và 5 và 7. Đều là những số nguyên tố.
n/i sẽ không chia cho những số có tận cùng là 0 4 6 8 nữa vì đã kiểm tra những số n/i chia hết cho 2. Tương tự với 3 5 7
Số cuối cùng là n/i nếu không chia hết cho i trong đoạn [2,n/i -1] thì chỉ chia hết cho 1 và chính nó nên cũng là số nguyên tố.
Vì vậy không cần kiểm tra i có phải là nguyên tố trong bài code này.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?