Pascal khó!

M

megamanxza

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Cho số A. Chia số A ra thành tổng của các số nguyên tố dương sao cho số lượng các số nguyên tố đó là nhiều nhất và mỗi số không được xuất hiện quá 2 lần. Gọi B là số lượng các số nguyên tố được phân ra từ A.
VD: A=7=2+2+3 \Rightarrow B=3
A=12=2+2+3+5 \Rightarrow B=4
Viết chương trình nhập vào số A từ bàn phím và xuất ra số B tương ứng với số A.
Hiện giờ mình đang rất đau đầu với bài này :khi (63)::khi (137)::khi (71):! Và mình rất cần code để nghiên cứu :khi (59)::khi (46):! Các bạn giúp mình nhaaaaaaaaa :khi (105)::khi (188)::khi (177):!
 
M

megamanxza

Các bạn nêu rõ thuật toán (thêm code thì càng tốt vì mình cần code để nghiên cứu) chứ nói mơ hồ thế thì làm sao mình hiểu đây bạn thienvamai?
 
T

thienvamai

Bước 1: dùng sàng eratos để tìm các số nguyên tố nhỏ hơn 50
Bước 2:
gọi mảng b[j] là cách tạo nhỏ nhất của số j (1<=j<=50)
đặt tất cả b[j] = 2^30 (hoặc to hơn nếu muốn)
backtrack(i,j) là với i số nguyên tố có thể tạo ra số j
đặt biến bool usep nghĩa là đã hoặc chưa dùng 1 số nào đó 2 lần (thật sự là ko cần quan tâm đấy là số nào)
và mảng used[k] nghĩa là đã / chưa dùng số nguyên tố thứ k
khi backtrack( i,j)
nếu i nhỏ hơn b[j] thì đặt b[j]=i
chạy 1 vòng for k từ 1-> đến số số nguyên tố <=50
nếu usep==false thì:
đặt usep=true
backtrack(i+1,j+p[k]) // p là mảng các số nguyên tố
chuyển lại usep về false
else if used[k]==false thì
đặt used[k]=true
backtrack(i+1,j+p[k])
chuyển lại used[k]=false
đại khái thế
mình code bằng c++ phần backtrack hi vọng bạn hiểu
PHP:
void bt(int x,int y) 
{ 
    int i; 
    if(x<=50) 
    { 
        b[x]=max(b[x],y); 
        for(i=1; i<=l; i++) 
            if(usin&&used[p[i]]) continue; 
        elif (!usin) 
        { 
            usin=true; 
            bt(x+p[i],y+1); 
            usin=false; 
        } 
        elif(!used[p[i]]) 
        { 
            used[p[i]]=true; 
            bt(x+p[i],y+1); 
            used[p[i]]=false; 
        } 
    } 
}
 
Last edited by a moderator:
M

megamanxza

Bạn ơi, cái code bạn mới đăng là của ngôn ngữ lập trình nào thế?
 
Top Bottom