01/10/2018, 12:03

Code phân tích N thành thừa số nguyên tố bị sai kết quả

Đề bài yêu cầu nhập số nguyên, sau đó phân tích thành thừa số nguyên tố. ví dụ nhập 100 sẽ in ra 2 2 5 5. Cho em hỏi bài của em sai ở bước nào mà nó chạy ra kết quả lỗi ạ. Ai góp ý giùm em với.

#include <stdio.h>
#include <math.h>

void print(int n);
int check_SNT(int x);

int main()
{
	int n;
	do
	{
		printf("Nhap so nguyen duong n: ");
		scanf_s("%i", &n);
	} while (n < 1);
	print(n);
	return 0;
}

void print(int n)
{
	if (n == 1)
		printf("
"); 
	else for (int i = 2; i <= n; i++)
		if (n%i == 0) if (check_SNT(i))
		{
			printf("%i ", i);
			print(n / i);
		}
}

int check_SNT(int x)
{
	int check = 1;
	for (int i = 2; i <= sqrt(x); i++)
		if (x%i == 0) check = 0;
	return check;
}
Lương Thế Hải viết 14:15 ngày 01/10/2018

Lỗi sai như thế nào vậy bạn?

Phạm Minh Hiếu viết 14:10 ngày 01/10/2018

Ví dụ nhập 10 nó sẽ xuất ra
2 5
5 2
Nhập 6 thì xuất ra
2 3
3 2
Mà nhập 4 hay 9 thì ra đúng đáp án

rogp10 viết 14:13 ngày 01/10/2018

Thực ra không cần phải “check” lại đâu cứ chia cho đến không còn thừa số đó thì nghiễm nhiên những số chia hết sẽ toàn là nguyên tố.

HK boy viết 14:15 ngày 01/10/2018

25 với 52 khác gì nhau?
23 với 32 khác gì nhau?

Bạn cho tất cả kết quả vào 1 array, rồi bạn viết ngược lại là đúng thôi chứ có gì đâu.

Lương Thế Hải viết 14:15 ngày 01/10/2018

Ý tưởng của bạn là gì?

rogp10 viết 14:13 ngày 01/10/2018

Dễ thấy code này không hề làm gì với n nên chỉ đúng với số square-free.

Phạm Minh Hiếu viết 14:04 ngày 01/10/2018

Mình tìm số nguyên tố nhỏ nhất có thể chia hết cho n sau đó in số đó ra, rồi lại tiếp tục hàm đó với n=n/i, đến khi chia đến n=1 thì dừng đệ quy

Phạm Minh Hiếu viết 14:16 ngày 01/10/2018

Không bạn ơi, chương trình xuất kết quả cả 2 đáp á là 2 5
5 2 luôn. Nên mình mới bảo sai đấy bạn.

HK boy viết 14:07 ngày 01/10/2018

print(n / i);

Bạn đệ quy chỗ này làm gì, trong khi bạn chỉ cần n /= i.

Đỗ Trung Quân viết 14:17 ngày 01/10/2018

Em tìm kiếm trên diễn đàn cũng có nhiều bài như này rồi nhé.

#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; } } }
for(i=2;i<=n;i++){
        while(n%i==0){
            if(n==i) std::cout<<i;
            else std::cout<<i<<" * ";
            n=n/i;
        }
}
Phạm Minh Hiếu viết 14:05 ngày 01/10/2018

à tại em đang học phần đệ qui nên muốn làm đệ quy ấy mà anh.

Phạm Minh Hiếu viết 14:14 ngày 01/10/2018

nếu không có hệ thức đệ quy thì chương trình sẽ bỏ qua số nguyên tố vừa chia xong, có thể nó sẽ được chia lại lần nữa nên nếu bỏ qua sẽ sai.

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

Ai bảo thế? Bạn đã in ra i rồi, bạn chia i rồi, làm sao mà bỏ qua số nguyên tố vừa chia được?

Phạm Minh Hiếu viết 14:09 ngày 01/10/2018

có thể chia lại lần nữa. ví dụ số 4 = 2*2 sẽ in ra 2 2. làm như bạn chỉ có số 2 thôi :))

HK boy viết 14:03 ngày 01/10/2018

Rách việc nhỉ.

if (i thoả mãn) {
    while (n % i == 0) {
        printf("%d ", i);
        n /= i;
    }
}
Bầu Sỹ viết 14:04 ngày 01/10/2018

yêu cầu của đề là viết đệ quy mà bạn

Bầu Sỹ viết 14:08 ngày 01/10/2018

#include <stdio.h>
#include <math.h>

void print(int n);

int main()
{
int n;
do
{
printf(“Nhap so nguyen duong n: “);
scanf_s(”%i”, &n);
} while (n < 1);
print(n);
system(“pause”);
return 0;
}

void print(int n)
{
int i;
if (n == 1)
printf("\n");
else
{
for (i = 2; i <= n; i++)
if (n%i == 0)
{
printf("%i ", i);
break;
}
print(n / i);
}
}

bạn có thể mình sửa thê này, thứ nhất là không cần hàm check, thứ hai là đừng bỏ đệ quy vào trong vòng lặp kể cả có break; đi nữa,

Bầu Sỹ viết 14:15 ngày 01/10/2018

Hàm check thừa mình k giải thích, vấn đề đệ quy giống như gọi hàm trong hàm, vì bạn bỏ vào vòng lặp, giả sử bạn nhập 100, trong vòng lặp for đầu tiên nó tìm ra 2, sau đó nó gọi hàm và tìm tiếp đến khi trờ về 1( 100/i/i/i ==1), nó thoát và lại bắt đầu vòng lặp for với giá trị n=100, bắt đầu từ i=3, nó lại tìm ra 5 và bắt đầu tiếp, vòng lặp đó làm đệ quy của bạn chạy trùng

Bài liên quan
0