30/09/2018, 20:14

[C/C++] Bài tập khó bác nào cùng vào xẻ chơi :))

Cho số nguyên dương N lớn hơn hoặc bằng 8. Hãy phân tích N thành tổng của 4 số nguyên tố, các cách phân tích là hoán vị của nhau được xem là một.

  • Yêu cầu : Xác định tất cả các cách phân tích N như trên.
  • Dữ liệu vào : Từ tập tin văn bản PHANTICH.INP. Gồm 1 dòng duy nhất chứa số nguyên dương N
  • Dữ liệu ra : Ghi ra tập tin văn bản PHANTICH.OUT Gồm M + 1 dòng . Trong đó :
    • Dòng đầu tiên là số nguyên dương M : M là số cách phân tích N thành tổng của 4 số nguyên tố.
    • M dòng tiếp theo là các kết quả phân tích số N thành tổng 4 số nguyên tố.
      Ví dụ :

Dưới đây là code của mình viết nhưng mà hình như bị lỗi chỗ nào ấy :
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

int main ()
{
	int N, M, i, j, o, p,CheckSNT, X, X2, Tong;
	int Sohang[4], SoNguyenTo[X];
	X = 2;	M = 0;
	Tong = 0;
	ifstream PhanTich ("phantich.txt");
	if(! PhanTich.is_open())
	{
		cout << "Khong tim thay file 
 ...";
		return 0;
	}
	PhanTich >> N;
	PhanTich.close();
	cout << "Da doc du lieu 
";
	ofstream PhanTich2 ("ketqua.txt");
	PhanTich2 << "Ket qua : 
";
	SoNguyenTo[1] = 2;
	SoNguyenTo[2] = 3;
	for (int i = 2; i <= N; i++)
	{
		
		for(int j = 2; j <= sqrt((float)i); j++)
	 	{	
			if(i%j == 0)
			{
				CheckSNT = 1;
				break;
			}
			else
			{
				CheckSNT = 2;
			}
		}
		if(CheckSNT != 1)
		{
			X++;
			SoNguyenTo[X] = i;
			
		}
	}
	for ( int i = 1; i <= X; i++)
	{
		cout << SoNguyenTo[i] << endl;
	}
	
	// TH 1 : 4 so giong nhau
	for(int i = 1; i <= X; i++)
	{
		Sohang[1] = SoNguyenTo[i];
		Sohang[2] = SoNguyenTo[i];
		Sohang[3] = SoNguyenTo[i];
		Sohang[4] = SoNguyenTo[i];
		Tong = Sohang[1] + Sohang[2] + Sohang[3] + Sohang[4];
		if(Tong == N)
		{
			M++;
			PhanTich2 << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
			cout << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
			
		}
	}
	// TH 2 : 3 so giong nhau 1 so khac
	for(int i = 1; i <= X; i++)
	{
		Sohang[1] = SoNguyenTo[i];
		Sohang[2] = SoNguyenTo[i];
		Sohang[3] = SoNguyenTo[i];
		for (int j = 1; j <= X; j++)
		{
			Sohang[4] = SoNguyenTo[j];
			Tong = Sohang[1] + Sohang[2] + Sohang[3] + Sohang[4];
			if(Tong == N)
			{
				M++;
				PhanTich2 << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
				cout << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
				
			}
		}
	}
	// TH 3 : 2 so giong nhau 1 va 2 so giong nhau 2
	for(int i = 1; i <= X; i++)
	{
		Sohang[1] = SoNguyenTo[i];
		Sohang[2] = SoNguyenTo[i];	
		for (int j = 2; j <= X; j++)
		{
			Sohang[3] = SoNguyenTo[j];
			Sohang[4] = SoNguyenTo[j];
			Tong = Sohang[1] + Sohang[2] + Sohang[3] + Sohang[4];
			if(Tong == N)
			{
				M++;
				PhanTich2 << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
				cout << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << "
";
				break;
			}		
		}
	}
	// TH 4 : 2 so giong nhau  
	for(int i = 1; i <= X; i++)
	{
		
		Sohang[1] = SoNguyenTo[i];
		Sohang[1] = SoNguyenTo[i];		
		for (int j = 1 + i; j <= X; j++)
		{
			Sohang[3] = SoNguyenTo[j];
			for (int o = 1 + j; o <= X; o++)
			{
				Sohang[4] = SoNguyenTo[o];
				Tong = Sohang[1] + Sohang[2] + Sohang[3] + Sohang[4];
				if(Tong == N)
				{
					M++;
					PhanTich2 << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
					cout << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
					break;
				}	
			}
				
		}
	}
	// TH  : 4 so khac nhau
	for(int i = 1; i <= X; i++)
	{
		Sohang[1] = SoNguyenTo[i];
		for (int p = 1 + i; p <= X; p++ )
		{
			Sohang[2] = SoNguyenTo[p];		
			for (int j = 1 + p; j <= X; j++)
			{
				Sohang[3] = SoNguyenTo[j];
				for(int o = 1 + j; o <= X; o++)
				{
					Sohang[4] = SoNguyenTo[o];
					Tong = Sohang[1] + Sohang[2] + Sohang[3] + Sohang[4];
					if(Tong == N)
					{
						M++;
						PhanTich2 << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
						cout << N << " = " << Sohang[1] << " + " << Sohang[2] << " + " << Sohang[3] << " + " << Sohang[4] << endl;
						break;
					}
				}
			
			}
		}		
	}
	PhanTich2 << M << endl;
	PhanTich2.close();
	cout << " 
 Hoan Tat 
";
	system("pause");
}
Sáng Béo viết 22:15 ngày 30/09/2018

cho code vào markdown đi bạn.


Bài này dễ í mà, Không làm.

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

cho vào sao đây mò nãy h

Sáng Béo viết 22:18 ngày 30/09/2018

cho vào sao đây mò nãy h

hình như cho vào được rồi kìa
mà mất mấy cái include thư viện rồi thì phải

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

yub dc oy` :)) ! Bài này làm từ trưa tới h không ra … search google tham khảo ko có :(( !!! Đau khổ … chưa tắm chưa nhai cơm nữa chứ hjx

Sáng Béo viết 22:21 ngày 30/09/2018

chắc là bài này dùng đệ quy quay lui, với mỗi cấu hình thì phần tử sau lớn hơn hoặc bằng phần tử trước.


mà hình như dùng đệ quy là cách không tối ưu đâu. chờ @Gio vào xem thế nào

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

ùm mình chỉ ms học C++ có 1 tuần à chưa tìm hiểu đệ quy hay quay lui là j nữa để chút xem list tut của a Đạt xem có hem :3

chu đức anh viết 22:26 ngày 30/09/2018

Bài này ngoài phương pháp duyệt trâu bò thì không biết có cách nào tốt hơn không nhỉ.

Gió viết 22:24 ngày 30/09/2018

Dùng sàng nguyên tố duyệt đến n dc cỡ n/logn số nguyên tố. Dpt nloglogn
Duyet 1cặp: lưu tổng từng cặp thì có (n/logn)^2 cặp. Sort tổng các cặp lập dc
Duyệt 1 cặp còn lại: sau đó dùng tìm nhị phân để kiếm trong mảng 1 cặp phù hợp
Dpt của thuật toán cỡ n^2logn

Code tham khảo: python

Sáng Béo viết 22:22 ngày 30/09/2018

Dùng sàng nguyên tố duyệt đến n dc cỡ n/logn số nguyên tố. Dpt nloglognDuyet 1cặp: lưu tổng từng cặp thì có (n/logn)^2 cặp. Sort tổng các cặp lập dcDuyệt 1 cặp còn lại: sau đó dùng tìm nhị phân để kiếm trong mảng 1 cặp phù hợpDpt của thuật toán cỡ n^2logn

lần này thì gió nói khó hiểu quá, không nắm kịp rồi

Tuan Tran Duong viết 22:22 ngày 30/09/2018

Nhìn code thấy khủng khiếp luôn.

Hùng Quang viết 22:29 ngày 30/09/2018

bài này làm mình liên tưởng đến giả thiết goldbach mà tới giờ chỉ có terence tao cmt với n=5 còn nhỏ hơn thì chịu

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

chú học gì mà có bài toán chất thế ??? anh có tài liệu giải thuật nâng cao đây , chú cần ko anh share cho

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

zạ cần :)) !! E ms học 11 thôi nên toàn học rừng chứ ko có bài bản :((

Trường Giang viết 22:21 ngày 30/09/2018

ĐÂY LÀ THÁNH HẢ :)) !!! TRÌNH YẾU ĐẾN NỔI KHÔNG HIỂU LUÔN QÁ TỆ :((

Bậy, chê bạn ấy vậy là không được. Bạn ấy không hiểu thì giúp bạn ấy hiểu vấn đề chứ.

zạ cần :)) !! E ms học 11 thôi nên toàn học rừng chứ ko có bài bản :((

Chú ý nha bạn, không được sử dụng ngôn ngữ teen. Lần sau rút kinh nghiệm nhé.

*grab popcorn* viết 22:16 ngày 30/09/2018

Thế này
1/ Sàng ra 1 danh sách số nguyên tố và bỏ nó vô 1 list riêng. (ở code trên là p )
2/ Tính tổng từng cặp số nguyên tố và lưu lại các cặp đó với tổng của nó. Sau đó sort theo tổng.
3/ Với mỗi cặp đã có, ta tìm cặp còn lại và lôi 2 cặp nguyên tố kia ra là xong.

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

dua cai email chu day

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

đề ko cho biết N tối đa là bao nhiêu à?

Sáng Béo viết 22:27 ngày 30/09/2018

Bậy, chê bạn ấy vậy là không được. Bạn ấy không hiểu thì giúp bạn ấy hiểu vấn đề chứ.

ý chủ thớt là bảo trình của chủ thớt còn kém, không hiểu Gio viết gì luôn mà

Ai Android viết 22:28 ngày 30/09/2018
  1. Sàng nguyên tố cho vào mảng A (m phần tử)
  2. F[i][j][k] là số cách phân tích tổng bằng i dùng k số nguyên tố thứ j
  3. F[i][j][k]= sigma( f[i-k*a[j]] [j-1] [0->4])
  4. in ra thì truy vết ngược

Mới nghĩ thế test xem sao
chắc là O(nm)

Sáng Béo viết 22:23 ngày 30/09/2018

Mới nghĩ thế test xem sao chắc là n^2

quy hoạch động hả a?

Bài liên quan
0