PDA

View Full Version : Các bác giúp hộ em cái



leducan111
16-04-2009, 21:11
Em đang làm bài đồ án C++. Có bài này chẳng biết bắt đầu từ đâu, mong các bác giúp đỡ cái.

Đề đây các bác nhé: Tìm tất cả các số có sáu chữ số sao cho tất cả các tích của nó với 2, 3, 4, 5, 6 đều viết được từ số ban đầu bằng cách hoán vị các chữ số.

kimduquan
17-04-2009, 11:23
cho i chạy từ 100000 đến 999999 với mỗi bước kiểm tra xem số đó có phù hợp với yêu cầu đề bài ko,nếu có thì lưu lại(cách này là phương pháp vét cạn nên nếu bạn làm theo cách này điểm sẽ ko cao),phưong pháp để kiểm tra xem số i có phù hợp yêu cầu đề bài :đầu tiên đếm số chữ số có trong i và tần suất xuất hiện của từng chữ số và lưu lại,lần lượt nhân i với 2,3,4,5,6 ; đếm số chữ số và tần suất xuất hiện của từng chữ số có trong tích vừa tìm được rồi so sánh với số chữ số và tần suất xuất hiện của từng chữ số trong i,nếu khớp thì là đúng ,khác thì là sai.

leducan111
18-04-2009, 00:49
Hic. E thu lam theo bac kimduquan mah ko dc. Bac nao co cach ji hay ko? Jup e cai

kimduquan
18-04-2009, 14:52
sax sao lại ko được nhỉ,chẳng lẽ tui cùi bắp vậy sao?bạn thử cho tui xem code bạn viết xem sai chỗ nào?thui để tui xem lại cái đã.

thaoquyenctk31
19-04-2009, 21:00
Hic. E thu lam theo bac kimduquan mah ko dc. Bac nao co cach ji hay ko? Jup e cai

nói mà ko hiểu dc cái gì cả, ai cũng biết diều bác nói chỉ có điều là chuyển nó sang code thì thế nào thôi, làm sao để kiểm tra điều kiện bây giờ. 1 câu bé tý nhìn ngắn củn vậy mà viết code dài.......... này thì ai ma dám làm nữa :((

kimduquan
21-04-2009, 17:54
nếu bạn muốn ngắn thì cũng hơi khó,còn cái điều kiện thì nếu muốn kiểm tra 1 số a thì bạn tạo 1 mảng để lưu các chữ số có trong a,rồi tạo 1 mảng thứ 2 để lưu tích của a với 2 ,bạn sắp xếp 2 mảng tăng dần rồi kiểm tra xem 2 mảng có bằng nhau ko,nếu đúng thì xuất mảng 1 ra sau khi kiểm tra a xong thì bạn reset lại 2 mảng để dùng cho số tiếp theo,bạn làm tương tự với các số còn lại,để giúp chương trình chạy nhanh hơn thì bạn có thể thêm điều kiện sao cho số số lượng các số cần xét là ít nhất(cái này gọi là kĩ thuật nhánh cận),ví dụ:bạn thấy rằng 1 số >500000 thì tích của nó với 2 sẽ có 7 chữ số nên chỉ cần phải xét các số <5000,còn 1 số tính chất nữa bạn tự tìm hiểu.Đây chỉ là phương pháp vét cạn nên chuyện chương trình chạy lâu là ko thể tránh khỏi,ngoài phương pháp này thì còn phương pháp dùng hàm sinh nhưng nó cũng khá phức tạp,nói chung là nói thì dễ làm mới khó nên mình sẽ nhường phần khó nhất cho bạn.

leducan111
22-04-2009, 08:23
Hix. Hiểu vấn đề là 1 chuyện, nhưng chuyển sang code hơi khó bác ơi. Bác có thể cho em tham khảo 1 đoạn code được ko?

kimduquan
22-04-2009, 08:33
code :
int check(long n)
{int a[6],b[6];
long temp=n;
for(int i=0;i<6;i++)
{a[i]=temp%10;temp/=10;}
temp=n*2;
for(int i=0;i<6;i++)
{b[i]=temp%10;temp/=10;
sort(a);sort(b);
for(int i=0;i<6;i++)
{if(a[i]!=b[i])
{for(int j=0;j<6;j++)
a[j]=-1;
return 0;
}
}
return 1;
}
bạn chỉ cần viết thêm hàm sắp xếp mảng nữa là xong.

leducan111
22-04-2009, 18:06
Ok. Cám ơn sự giúp đỡ của bác rất nhiều