You are on page 1of 8

1.

Hoàng Văn Tài B22DCAT252

Họ và tên 2.Nguyễn Minh Quân B22DCCN665

3.Bùi Văn Hiến B22DCCN292


Mã sinh viên
4.Phạm Long Nhật B22DCCN581

5.Đào Công Chính B22DCAT043

Nhóm học phần Nhóm 06 (10)

Bài lập trình Số 1

Môn Toán rời rạc

Giảng viên Nguyễn Thị Mai Trang

Ngày 9/10/2023

Điểm

Bài 1:Ma trận số nguyên tố


1.1 Đề Bài:
Viết chương trình (C, C++) giải bài toán:
Cho hình vuông gồm 25 hình vuông đơn vị.
Hãy điền các số từ 0 đến 9 vào mỗi hình vuông đơn vị sao cho những
điều kiện sau được thỏa mãn:
a) Đọc từ trái sang phải theo hàng ta nhận được 5 số nguyên tố có 5
chữ số;
b) Đọc từ trên xuống dưới theo cột ta nhận được 5 số nguyên tố có 5
chữ số;
c) Đọc theo hai đường chéo chính ta nhận được 2 số nguyên tố có 5
chữ số;
d) Tổng các chữ số trong mỗi số nguyên tố đều là S cho trước..

INPUT OUTPUT

Nhập tổng S từ bàn phím In ra ma trận theo yêu cầu

1.2 Sơ đồ khối :
Start Sang()

vector vs chứa các số


Nhập s nguyên tố 5 chữ số có
tổng các chữ số = s

vector<string> vs;
s<1||s>45 vs.push_back(x);

i++<1e5 snt(i)&&tcs(i)

Kiểm tra đường chéo


mat[5][5]={-} chính 1 (bước cuối) và
in ra ma trận mat

Hàm inmat(mat)
thiết lập mảng
solve(mat,vs,0,s) điều kiện

char a[5];
(tcs(a)==s&&
j==11 snt[stoi(a)])
hàm seta(mat,a,j);

kiemtra
i<n=vs.size() dien(mat,a,j)
(vs[i],a)

i++
Reset lại ma
dien(mat,vs[i],j); trận tại sau
solve(mat,vs,j+1,s); khi duyệt
hết trường
hợp ở bước j

Điền số t/m vào ma


trận và đệ quy tìm
số tiếp theo
1.3 Code:
#include <bits/stdc++.h>
using namespace std;
const int SIZE=1e5;
int snt[SIZE];
void sang(){ // sàng số nguyên tố
snt[0]=snt[1]=0;
for(int i=2; i<SIZE; i++){
snt[i]=1;
}
for(int i=2; i<=sqrt(SIZE); i++){
for(int j=i*i; j<SIZE; j+=i){
snt[j]=0;
}
}
}
int tcs(string x){ // tính tổng chữ số
int tong=0;
for(int i=0, n=x.size(); i<n; i++){
tong+=(x[i]-'0');
}
return tong;
}
bool kiemtra(string x, char *a){// kiểm tra xem 1 số có thoả mãn điều kiện
k
for(int i=0; i<5; i++){
if(a[i]!='-' && x[i]!=a[i])
return false;
}
return true;
}
void dien(char (*mat)[5], string x, int j){// điền số vào ma trận
if(j!=2 && j!=11){ // chỉ số j là thứ tự điền các hàng, cột, đường chéo
if (!j || (j%2 && j>1) ){ // 0 3 5 7 9: hàng
for(int i=0;i<5; i++){ // 1 4 6 8 10: cột
if(!j) // 2 11: đường chéo
mat[j][i]=x[i];
else
mat[j-(j/2 +1)][i]=x[i];
}
}
else {
for(int i=0; i<5; i++){
if(j==1)
mat[i][j-1]=x[i];
else
mat[i][(j-2)/2]=x[i];
}
}
}
else {
for(int i=0; i<5; i++){
if(j==2)
mat[i][4-i]=x[i];
else
mat[i][i]=x[i];
}
}
}

void seta(char (*mat)[5], char *a,int j){ // thiết lập mảng điều kiện cho số
if(j!=2 && j!=11){
if (!j || (j%2 && j>1) ){
for(int i=0;i<5; i++){
if(!j)
a[i]=mat[j][i];
else
a[i]=mat[j-(j/2 +1)][i];

}
}
else {
for(int i=0; i<5; i++){
if(j==1)
a[i]=mat[i][j-1];
else
a[i]=mat[i][(j-2)/2];
}
}

}
else {
for(int i=0; i<5; i++){
if(j==2)
a[i]=mat[i][4-i];
else
a[i]=mat[i][i];
}
}
}
void inmat(char(*mat)[5]){ // in ma trận
for(int i=0; i<5; i++){
for(char c:mat[i])
cout<<c<<" ";
cout << endl;
}
}

void solve(char (*mat)[5], vector<string> vs, int j,int s){//hàm giải ma trận
char a[5];
seta(mat,a,j);// thiết lập mảng điều kiện
if(j==11){ // bước kiểm tra đường chéo chính 1 (bước cuối)
if(tcs(a) == s && snt[stoi(a)]){
inmat(mat);
cout << endl;
}
}
else{
for(int i=0, n=vs.size(); i<n; i++){
if(kiemtra(vs[i],a)){ // khi tìm thấy 1 số thoả mãn đk,
điền vào ma trận
dien(mat,vs[i],j);
solve(mat,vs,j+1,s); // đệ quy tìm số tiếp theo
}
}
dien(mat,a,j); // reset lại ma trận tại sau khi duyệt hết trường
hợp ở bước j
}
}
main(){
sang();
int s;
do{
cin >> s;
}
while(s<1 || s>45);
vector<string> vs; // vector vs chứa các số nguyên tố 5 chữ số có tổng
các chữ số = s
for(int i=1e4; i<SIZE; i++){
if(snt[i]){
string x = to_string(i);
if(tcs(x)==s)
vs.push_back(x);
}
}
int n=vs.size();
char mat[5][5];
for(int i=0; i<5; i++)
memset(mat[i],'-',5); // khởi tạo ma trận 5x5 chứa '-'

solve(mat,vs,0,s);
}

1.4 Kết quả:

You might also like