PDA

View Full Version : cần giúp bài "dãy số hạnh phúc"



okmen910
31-12-2007, 14:35
Dãy số tự nhiên A(1),A(2),...A(k)được gọi là dãy số hạnh phúc khi:
+Dãy trên là một dãy giảm dần
+Với mọi i,A(i) hoặc là số nguyên tố hoặc phải là ước một trong các số A(1);A(2);...;A(i-1)
ví dụ:8,7,5,4,3,2,1 là dãy số hạnh phúc (với N=8, dãy số hạnh phúc có 7 phần tử).
Yêu cầu:Nhập một số tự nhiên N từ bàn phím và in ra màn hình một dãy hạnh phúc càng dài càng tốt với số hạng đầu tiên là N

Cảm ơn các bác!!!

m2mpro
31-12-2007, 16:32
Bài này hóc búa đấy, đợi tí đang suy nghĩ... có lẽ dùng hai hàm check và dùng mảng gán là được

m2mpro
31-12-2007, 16:57
Program baitap;
uses crt;
type
mang = array[1..100] of integer;
var
a,x:mang;
n,i,k:integer;
Function ngto(a:mang;i:integer):boolean;
var k:integer;
begin
ngto:=false;
if a[i]<2 then exit;
FOr k:=2 to round(sqrt(a[i])) do
If a[i] mod k = 0 then exit;
ngto:=true;
end;
Function uocso(a:mang;i,n:integer):boolean;
var k:integer;
begin
For k:=n downto i+1 do
If a[k] mod a[i] = 0 then
begin
uocso:=true;
exit;
end
else uocso:=false;
end;
BEGIN
Write('n = ');
Readln(n);
For i:=n downto 1 do
a[i]:=i;
i:=1;
k:=1;
While i<=n do
begin
IF ngto(a,i) or uocso(a,i,n) then
begin
x[k]:=a[i];
k:=k+1;
i:=i+1;
end else
i:=i+1;
end;
For i:=k downto 1 do
write(x[i]);
Readln;
END.
Test luôn rồi đấy. THuật toán hơi rắc rối:
Đầu tiên gán từ n về 1 cho mảng a rồi là kiểm tra xem a[i] có phải số nguyên tố và ước số không. Nếu là ước số và nguyên tố thì gán vào mảng x. CHúc bạn học tốt.

phuclun
31-12-2007, 17:19
sao tui ko hiểu bài bạn nhỉ,tui giống bạn phần kt SNT nhưng mấy phần khác tui ko hiểu lắm.Thuật toán tui cũng giống bạn nhưng tui nghĩ chỉ cần làm như thế này


k:=2;
for i:=n downto 1 do
if (ngt(i)=true) or (n mod i=0) then
begin
a[k]:=i
inc(k);
end;

Chỉ vậy thôi,vì nó là ước của các số khác thì nó cũng là ước cuả n,chỉ cần xem n có chia hết cho nó ko thôi.
Còn về phần kt số nguyên tố thì chắc dùng 1 tham số i là đc rồi bạn ạ,ko cần dùng tham số a đâu.Tôi chắc chắn bài bạn sẽ báo trùng tham số bởi vì bạn thông báo tham số a dạng mảng là biến toàn cục mà bạn còn thông báo thêm ở các thủ tục nưã.Chắc trong quá trình code bài lên đây bạn viết thưà.
Chúc bạn vui vẻ

m2mpro
31-12-2007, 18:39
Chỉ vậy thôi,vì nó là ước của các số khác thì nó cũng là ước cuả n,chỉ cần xem n có chia hết cho nó ko thôi.
Ừ, không nghĩ ra.. đúng là chỉ cần thế. Tại đọc cái đề không rõ ở chỗ "Với mọi i,A(i) hoặc là số nguyên tố hoặc phải là ước một trong các số A(1);A(2);...;A(i-1)" nên lầm lẫn.Còn bài của tui thì tại dùng mảng để lưu giá trị nên mới dùng tham số a:mang. Cám ơn bạn đã góp ý.

okmen910
09-01-2008, 16:15
em không hiểu lắm chỗ số nguyên tố.Các bác có thể giải thích thêm được không

gianhut
10-01-2008, 05:38
Function ngto(a:mang;i:integer):boolean;
var k:integer;
begin
ngto:=false;
if a[i]<2 then exit;
FOr k:=2 to round(sqrt(a[i])) do
If a[i] mod k = 0 then exit;
ngto:=true;
end;
nên làm thế này:


Function ngto(a:mang;i:integer):boolean;
var k:integer, loopEnd: integer;
begin
ngto:=false;
if a[i]<2 then exit;
loopEnd := round(sqrt(a[i]));
FOr k:=2 to loopEnd do
If a[i] mod k = 0 then exit;
ngto:=true;
end;

như vậy thì sẽ ko cần phải tính lại round(sqrt(a[i])) mỗi lần chạy xong 1 vòng for. :-)
và tương tự cho các phần sau.

P.S.: thuật toán khá là tối ưu :D

gameonline
11-01-2008, 11:13
hình như chương trình không chạy được thì phải;các bác thử giải thích thuật toán kĩ hơn không,tôi cũng chưa hiểu rõ đề bài lắm

tranvanho
11-01-2008, 12:51
thì cứ quét hết từ n cho đến 1
nếu thỏa thì cho nó vào dãy

ngtrhieu0011
11-01-2008, 14:24
bài này rất dẽ mờ. Nhập n, xuất vào mảng tát các snt nhỏ hơn n và các ước số cuả nó, xong ngồi sort lại là ok

thuonghcm
11-01-2008, 15:46
Dãy số tự nhiên A(1),A(2),...A(k)được gọi là dãy số hạnh phúc khi:
+Dãy trên là một dãy giảm dần
+Với mọi i,A(i) hoặc là số nguyên tố hoặc phải là ước một trong các số A(1);A(2);...;A(i-1)
ví dụ:8,7,5,4,3,2,1 là dãy số hạnh phúc (với N=8, dãy số hạnh phúc có 7 phần tử).
Yêu cầu:Nhập một số tự nhiên N từ bàn phím và in ra màn hình một dãy hạnh phúc càng dài càng tốt với số hạng đầu tiên là N

Cảm ơn các bác!!!

a chia hết cho b thì : a là bội của b ,{hay} b là ước của a?
a[i] là ước của một trong các a[1],a[2],a[3]...?
a[i]=8 thì sao nhỉ?

mr_invincible
12-01-2008, 11:06
a chia hết cho b thì : a là bội của b ,{hay} b là ước của a?
a[i] là ước của một trong các a[1],a[2],a[3]...?
a[i]=8 thì sao nhỉ?

Số đầu tiên là 8 mà bạn, số đó được cho trước chứ?

tranvanho
12-01-2008, 21:31
a chia hết cho b thì : a là bội của b ,{hay} b là ước của a?
a[i] là ước của một trong các a[1],a[2],a[3]...?
a[i]=8 thì sao nhỉ?

đề cho đúng rùi mà bạn

thuonghcm
12-01-2008, 22:46
vay à, vậy mà mình nhìn đề không thấy chỗ nào cho a[1]=n chứ ư

mr_invincible
13-01-2008, 12:52
vay à, vậy mà mình nhìn đề không thấy chỗ nào cho a[1]=n chứ ư

Đề viết thiếu thì phải tự hiểu thôi
:dontgetit :dontgetit :dontgetit

hpmhoang_1993
13-01-2008, 17:15
đề không hề viết thiếu.Các bác nhìn kĩ lại đi
Còn chỗ kt số nguyên tố thì nên làm thé này cho nhanh hơn

function ngto(a:integer):boolean;
var i:integer;
begin
ngto:=false;
i:=2;
while (a mod i<>0) and (i<a) do inc(i);
if n<>i then exit;
ngto:=true;
end;

mr_invincible
13-01-2008, 18:01
Còn chỗ kt số nguyên tố thì nên làm thé này cho nhanh hơn

function ngto(a:integer):boolean;
var i:integer;
begin
ngto:=false;
i:=2;
while (a mod i<>0) and (i<a) do inc(i);
if n<>i then exit;
ngto:=true;
end;

Làm như vậy còn chậm hơn vì bạn duyệt từ 2 đến a-1, còn làm như trên kia chỉ duyệt từ 2 đến căn bậc 2 của a thôi bạn ạ

hehe_kut3
17-03-2009, 21:37
e. các bạn có thể giúp mình giải bài tin này được không?Bài này khó wa. Mình vẫn chưa làm được.đề bài nha:tổng dương các số trên vòng tròn.Cho n số xếp trên 1 vòng tròn. Hãy chỉ ra vị trí mà ở đó nếu ta lần lượt cộng các số theo chiều kim đồng hồ thì tổng đạt đựoc luôn là số dương.

[=========> Bổ sung bài viết <=========]

các bạn làm nhanh giúp mình nha

thuonghcm
18-03-2009, 06:07
e. các bạn có thể giúp mình giải bài tin này được không?Bài này khó wa. Mình vẫn chưa làm được.đề bài nha:tổng dương các số trên vòng tròn.Cho n số xếp trên 1 vòng tròn. Hãy chỉ ra vị trí mà ở đó nếu ta lần lượt cộng các số theo chiều kim đồng hồ thì tổng đạt đựoc luôn là số dương.


Đề ngộ quá? nếu không có Giới hạn cuối thì c6p5ng chiều nào mà chẳng được?
mình nghĩ đề này thiếu dữ kiện, thiếu test nữa.................

huysun
20-03-2009, 17:12
Dãy số tự nhiên A(1),A(2),...A(k)được gọi là dãy số hạnh phúc khi:
+Dãy trên là một dãy giảm dần
+Với mọi i,A(i) hoặc là số nguyên tố hoặc phải là ước một trong các số A(1);A(2);...;A(i-1)
ví dụ:8,7,5,4,3,2,1 là dãy số hạnh phúc (với N=8, dãy số hạnh phúc có 7 phần tử).
Yêu cầu:Nhập một số tự nhiên N từ bàn phím và in ra màn hình một dãy hạnh phúc càng dài càng tốt với số hạng đầu tiên là N

Cảm ơn các bác!!!

theo tôi thì tìm tất cả các số nguyên tố nhỏ hơn N và tất cả các ước của N(tính cả N), sắp xếp giảm dần là xong.

hang_vt
21-03-2009, 13:25
e. các bạn có thể giúp mình giải bài tin này được không?Bài này khó wa. Mình vẫn chưa làm được.đề bài nha:tổng dương các số trên vòng tròn.Cho n số xếp trên 1 vòng tròn. Hãy chỉ ra vị trí mà ở đó nếu ta lần lượt cộng các số theo chiều kim đồng hồ thì tổng đạt đựoc luôn là số dương.

[=========> Bổ sung bài viết <=========]

các bạn làm nhanh giúp mình nha
theo mình nghĩ thì bài này là tìm đoạn con có tổng > 0 , nhưg nếu có nhìu vị trí mà lần lượt cộng các số luôn dương thì sao nhỉ ?

huysun
22-03-2009, 19:06
e. các bạn có thể giúp mình giải bài tin này được không?Bài này khó wa. Mình vẫn chưa làm được.đề bài nha:tổng dương các số trên vòng tròn.Cho n số xếp trên 1 vòng tròn. Hãy chỉ ra vị trí mà ở đó nếu ta lần lượt cộng các số theo chiều kim đồng hồ thì tổng đạt đựoc luôn là số dương.


tối nghĩa.
nếu "ta lần lượt cộng các số theo chiều kim đồng hồ thì tổng đạt đựoc luôn là số dương" thì có nghĩa là tổng các phần tử là số dương phải không?
bài này mang tính đệ quy, có lẽ dùng QHD

lvthuong2008
22-03-2009, 19:12
cái này khó quá em chịu thui