Giúp tìm lỗi bài vòng số nguyên tố
Một vòng tròn chứa 2n vòng tròn nhỏ (Xem hình vẽ). Các vòng tròn nhỏ được đánh số từ 1 đến n theo chiều kim đồng hồ. Cần điền các số tự nhiên từ 1 đến 2n mỗi số vào một vòng tròn nhỏ sao cho tổng của hai số trên hai vòng tròn nhỏ liên tiếp là số nguyên tố. Số điền ở vòng tròn nhỏ 1 luôn là số 1.
input
Số nguyên dương n ( 1 < n < 10 ) .
Output
Dòng đầu tiên ghi ra số k là số cách tìm được.
K dòng tiếp theo mỗi dòng ghi ra 1 cách điền các số vào các vòng tròn nhỏ. Cách điền nào có thứ tự từ điển nhỏ hơn thì xếp trước. Nếu K > 10000 thì chỉ cần ghi ra 10000 cách đầu tiên.
Ví dụ
Input:
4
Output:
4
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
mọi người giúp mình tìm lỗi đoạn code của bài trên với ạ
const fi =';
fo=';
type vector = array[1..20] of byte;
var n:longint; f:text;
x,d:vector;
snt:array[1..50] of boolean;
lutu:array[1..10000] of vector;
k,dem,i,j,s:longint;
procedure ssnt;
var j,i:longint;
begin
fillchar(snt,sizeof(snt),true);
for i:= 2 to trunc(sqrt(50)) do
if snt[i] then
begin
j:= i*i;
while j<=50 do
begin
snt[j]:= false;
j:= j+i;
end;
end;
end;
procedure update;
begin
if (snt[s+1]= false) then exit;
inc(k);
if k>10000 then exit;
dem:=k;
lutu[k]:= x;
end;
procedure vsnt(i:longint);
var j:longint;
begin
for j:= 2 to 2*n do
if d[j]=0 then
begin
x[i]:= j;
d[j]:= 1;
s:= x[i-1]+x[i];
if (snt[s]=true) then
if i=2*n then update
else vsnt(i+1);
d[x[i]]:= 0;
end;
end;
procedure init;
begin
k:= 0 ;
x[1]:= 1;
fillchar(d,sizeof(d),0);
ssnt;
vsnt(2);
end;
procedure doctep;
begin
assign(f,fi);reset(f);
readln(f,n);
init;
close(f);
end;
procedure ghitep;
begin
assign(f,fo);rewrite(f);
writeln(f,k);
for i:= 1 to dem do
begin
for j:= 1 to 2*n do write(f,lutu[i][j],' ');
writeln(f);
end;
end;
begin
doctep;
ghitep;
end.
@mua_ta:
p/s: Đề trong Tài liệu chuyên Tin quyển 1, đúng không?
Thêm 3 dấu ` (bên cạnh số 1) vào đầu và cuối code.
số 1 nào vậy bạn
phím 1 trên máy tính ấy bạn.
bạn giúp mình tìm lỗi sai với ạ
3 ` dấu bạn ơi. Bạn mới dùng 1 dấu thì sao mà nhìn được.
bạn fomat code lại giúp mình với mình viết 3 dấu ` rồi mà vẩn ko đc
Mình giúp bạn format được thì sao mình còn phải bảo bạn format làm gì
3 dấu ` vào đầu và cuối code…
Thế bạn đã thử test đề bài chưa mà bạn biết là sai? Bạn sai ở đâu thì bạn phải nói chứ.
xem giúp mình đoạn vsnt với update
link code đây bạn
https://drive.google.com/drive/u/0/my-drive
procedure vsnt(i)
của bạn là thủ tục đệ quy, bạn phải đưa điều kiện biên (i = 2*n
) lên đầu thủ tục. Không được cho vào trong vòng lặp for tìm số x[i], tức là đoạnchỉ thành
if d[j]=0 then
[/quote]
Bạn có thể kiểm tra nguyên tố ở đây luôn, tức là
Sai link rồi bạn ơi.
mô hình trong tài liệu là thế mà
Đừng bảo mình là Tài liệu chuyên Tin viết như thế nhé…
Mà mình thấy bạn có vẻ không hiểu lắm về thuật quay lui và code (code này chắc là code bạn viết rồi)
mình thấy mấy code mẫu trong tài liệu chuyên tin cx viết mà
Thật sự là một code thảm hoạ…
Bạn có chắc là bạn chép đúng 100% code trong TLCT không?
[spoiler]Mà mình cũng chả tin tưởng code ở đó lắm, có lần chép code ở quyển này, nộp lên SPOJ bị sai từa lưa sách này được cái lí thuyết thì tốt nhưng code thì…[/spoiler]
thế code bạn học ở đâu mà bài này mình lấy trên kienthuc24h.com bạn à
Mình sẽ không nói gì thêm…
Hơi phũ nhưng… bạn tự debug đi. Bạn thử sửa lại code của bạn: đưa điều kiện biên ra ngoài, sửa thêm một chút…
Mình không muốn bạn lấy bừa 1 code nào đấy cho bạn rồi bạn lên đây quẳng 1 đoạn code chỏng chơ, bắt mọi người đi tìm lỗi + giải thích code cho bạn. Xin lỗi chứ học kiểu này thì đến học cả trăm năm cũng chả nên cơm cháo gì.
Học từ làm bạn ạ.
p/s: Đừng dùng icon nữa, không phù hợp với hoàn cảnh đâu.
Code bị lỗi logic, khi mà
i = 2 * n
thìs = x[ 2 * n - 1] + x[ 2 * n ]
là một số nguyên tố,snt[ s + 1 ]
nữa sẽ không bao giờ xảy ra nếun <> 1
@Gio: Mình thấy code này sida lắm, chả ai để điều kiện biên ở trong vòng for cả @@
hoặc là có mỗi mình đưa điều kiện biên ra ngoài vòng for :||
Điều kiện update sai rồi,
snt[x[2*n] + 1 ]
mới đúng.IM LẶNG ĐƯỢC RỒI