PDA

View Full Version : Có ai biết thì giup mình bài nay caj'" CẮT SỐ"



pascalmen_9xpro
25-01-2011, 21:03
nhập vào 1 số
sau đó hay phan tích đó thành tổng của các chữ số integer sao cho tích của chúng là lớn nhất
nghe khó nhỉ

tut4ever
06-02-2011, 09:37
bt mà
có thể làm từ lệnh giả này nhé:
thừa biết a+b >= 2 căn ab (cosi ấy)
tích
--> ab max <=> a = b ổn --> theo hướng đó, nếu số ban đầu là số âm --> cặp cần tìm (0, sô ấy)
nếu số ban đầu dương thì:
gọi biến nữa là a: real nhé: a:= số ban đầu /2
--> giá trị cần tìm: số thứ nhất:= trunc(a)
số còn lại thì ai cũng biết được : số ban đầu - số thứ nhất
dạ hết ạ
còn cách khác là dùng vòng lặp: lấy 2 biến , tăng biến này lên 1 đơn bị ,giảm biến kia xuống 1 đơn vị. sao cho tổng không đổi. kiểm tra xem cặp nào có tích lơn nhất là xong!

kidsptn
09-02-2011, 00:43
bt mà
có thể làm từ lệnh giả này nhé:
thừa biết a+b >= 2 căn ab (cosi ấy)
tích
--> ab max <=> a = b ổn --> theo hướng đó, nếu số ban đầu là số âm --> cặp cần tìm (0, sô ấy)
nếu số ban đầu dương thì:
gọi biến nữa là a: real nhé: a:= số ban đầu /2
--> giá trị cần tìm: số thứ nhất:= trunc(a)
số còn lại thì ai cũng biết được : số ban đầu - số thứ nhất
dạ hết ạ
còn cách khác là dùng vòng lặp: lấy 2 biến , tăng biến này lên 1 đơn bị ,giảm biến kia xuống 1 đơn vị. sao cho tổng không đổi. kiểm tra xem cặp nào có tích lơn nhất là xong!

đọc kĩ đầu bài chưa bạn, ko phải là tách thành 2 số đâu. và chắc chắn ở đây không thể xét số âm được. mình chỉ cho bạn 3 ví dụ rồi bạn suy nghĩ thêm nhé:
6=4+2 có tích là 8
- 6= 3+3 có tích là 9
10=3+3+3+1 có tích là 27
10=3+3+2+2 có tích là 36

pascalmen_9xpro
10-02-2011, 20:16
bạn kidsptn noí đúng đấy ý mình la không phải 2 số đâu mà có thể là nhiều số

HGMinh95
11-02-2011, 10:02
Mọi người thử xem cách này có đúng ko
Nếu phân tích số k thành tổng của các số 3 và nhiều nhất là 2 số 2 thì sẽ được tích lớn nhất (tự chứng minh nhé :) )
==> Thuật toán sẽ là:
+ Nếu k mod 3 = 0 thì k= 3+3+...+3+3 (k div 3 số 3)
+ Nếu k mod 3 = 1 thì k= 3+3+...+2+2 (k div 3-2 số 3 và 2 số 2)
+ Nếu k mod 3 = 2 thì k= 3+3+...+3+2 (k div 3-1 số 3 và 1 số 2)

HGMinh95
11-02-2011, 18:41
to vi du nha
17
co the phan tich thanh 4 so nhu 2 4 5 6

17=3+3+3+3+3+2 3*3*3*3*3*2=486
17=2+4+5+6 2*4*5*6=240<486
17 phân tích thành 5 số 3 và 1 số 2 đúng rồi còn gì?????

edogan
13-02-2011, 08:40
tui thấy nó không ổn lắm
ví dụ: 10 =3+3+2+2 có tích bằng 36
10 =10+(-10)+3+(-3)+10 có tích bằng 9000.
cái đề đó nên đổi thành các số dưới kiểu word thì đúng hơn

HGMinh95
13-02-2011, 09:14
Nếu phân tích thành số âm thì làm sao tìm được tích lớn nhất

edogan
13-02-2011, 14:47
tích của hai số âm là một số dương mà
tui nghĩ bài này phải dùng định lí cô-si với nhiều số nguyên dương

pascalmen_9xpro
13-02-2011, 18:38
các số word cũng được hay số nguyên dương cũng được nhưng làm sao cho tích là cao nhất

edogan
14-02-2011, 12:51
nó có quy luật mà
VD: 10= 3+3+4 có tích lớn nhất
20= 3+3+3+3+3+3+2 có tích lớn nhất
30= 3+3+3+3+3+3+3+3+3+3 có tích lớn nhất
cho x:= N div 3
lập trình cho số đó biểu diễn dưới dạng tổng của x-1 số 3.
nếu N mod 3= 0 thì số cuối cùng cộng với 3
N mod 3=1 thì số cuối cùng cộng với 4
N mod 3 = 2 thì số cuối cùng cộng với 2
cái này thì dễ rùi phải không...

pascalmen_9xpro
16-02-2011, 21:13
đã nói là các số khác nhau mà

edogan
17-02-2011, 13:53
hehe. bạn chỉ bảo phân tích thành các số nguyên dương thui mà.

HGMinh95
17-02-2011, 18:35
Thuật toán của bài này là quay lui + quy hoạch động



uses crt;
var a:array[0..1000] of word;
k,maxlength,P,Pmax:word;
procedure Init;
begin
maxlength:=0;
Pmax:=0;
a[0]:=1;
P:=1;
end;
procedure PrintResult(n:word);
var i:word;
begin
Clrscr;
Writeln(' So can phan tich ',k);
For i:=1 to n do
Write(a[i],' ');
end;
procedure Attempt(k,n:word);
var i:integer;
begin
For i:=a[n-1]+1 to k do
begin
If (k-a[n-1]-1 <= a[n-1]+1) and (i<>k) then
If n<maxlength then Break
else begin i:=k-1; continue; end;
P:=P*i;
a[n]:=i;
If (i=k) and (P>Pmax) then
begin
PrintResult(n);
maxlength:=n;
Pmax:=P;
end;
If i<k then Attempt(k-i,n+1);
P:=P div i;
end;
end;
begin
Clrscr;
Init;
Write(' Nhap so can phan tich: '); readln(k);
Attempt(k,1);
readln
end.

pascalmen_9xpro
17-02-2011, 22:31
code của ban j cũng được đáy nhưng cần bổ sung để đưa ra tích lớn nữa là được thank! mình sẽ rút kinh nghiệm