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:

  • Format lại code bạn ơi. Thêm 3 dấu ` (bên cạnh số 1) vào đầu và cuối code.
  • Bạn đưa code của bạn lên phần mô tả topic nhé.
  • Bạn mô tả đề còn thiếu. Đề gốc còn có cả phần miêu tả đề bài.

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 :v:

Mình giúp bạn format được thì sao mình còn phải bảo bạn format làm gì :expressionless:
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 :v:
https://drive.google.com/drive/u/0/my-drive

  • Tại sao bạn code dễ sai: vì bạn không giải thích các mảng dùng để làm gì. Dù mình vẫn đọc được nhưng không phải ai cũng dễ dàng nhìn được code của bạn.
  • 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ạn

chỉ thành

vsnt(i+1);
  • [quote=“mua_ta, post:1, topic:49228”]
    if d[j]=0 then
    [/quote]

Bạn có thể kiểm tra nguyên tố ở đây luôn, tức là

if ((d[j] = 0) and (snt[x[i-1] + j] = true)) then
  • Tóm chung lại là thủ tục đệ quy của bạn viết sai. Bạn chưa học kĩ về cách viết thủ tục đệ quy à?

Sai link rồi bạn ơi.

1 Like

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)

1 Like

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 :expressionless: sách này được cái lí thuyết thì tốt nhưng code thì…[/spoiler]

1 Like

thế code bạn học ở đâu :v: 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 :v: 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ếu n <> 1

1 Like

@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.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?