01/10/2018, 10:15

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.
HK boy viết 12:22 ngày 01/10/2018

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

nắng viết 12:21 ngày 01/10/2018

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

HK boy viết 12:20 ngày 01/10/2018

phím 1 trên máy tính ấy bạn.

nắng viết 12:21 ngày 01/10/2018

bạn giúp mình tìm lỗi sai với ạ

HK boy viết 12:16 ngày 01/10/2018

3 ` dấu bạn ơi. Bạn mới dùng 1 dấu thì sao mà nhìn được.

nắng viết 12:16 ngày 01/10/2018

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

HK boy viết 12:27 ngày 01/10/2018

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

nắng viết 12:18 ngày 01/10/2018

xem giúp mình đoạn vsnt với update

nắng viết 12:18 ngày 01/10/2018

link code đây bạn
https://drive.google.com/drive/u/0/my-drive

HK boy viết 12:28 ngày 01/10/2018
  • 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

if (snt[s]=true) then
if i=2*n then update
else vsnt(i+1);

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 à?

link code đây bạn
https://drive.google.com/drive/u/0/my-drive

Sai link rồi bạn ơi.

nắng viết 12:24 ngày 01/10/2018

mô hình trong tài liệu là thế mà

HK boy viết 12:27 ngày 01/10/2018

Đừ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)

nắng viết 12:17 ngày 01/10/2018

mình thấy mấy code mẫu trong tài liệu chuyên tin cx viết mà

if (snt[s]=true) then
if i=2*n then update
else vsnt(i+1);

HK boy viết 12:19 ngày 01/10/2018

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]

nắng viết 12:22 ngày 01/10/2018

thế code bạn học ở đâu mà bài này mình lấy trên kienthuc24h.com bạn à

HK boy viết 12:19 ngày 01/10/2018

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…

bạn giúp mình tìm lỗi sai với ạ

xem giúp mình đoạn vsnt với update

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

thế code bạn học ở đâu

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.

Gió viết 12:30 ngày 01/10/2018

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

HK boy viết 12:20 ngày 01/10/2018

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

Nguyễn Đình Biển viết 12:27 ngày 01/10/2018

Điều kiện update sai rồi, snt[x[2*n] + 1 ] mới đúng.

nắng viết 12:20 ngày 01/10/2018

Mình sẽ không nói gì thêm…

IM LẶNG ĐƯỢC RỒI

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

Bài liên quan
0