Mang đến cho bạn hành trang là Kiến thức và Kinh nghiệm

Lựa chọn chủ đề bạn quan tâm

Cùng nhau thảo luận về các vấn đề

Hãy theo dõi chúng tôi nếu bạn thấy bổ ích

  1. Hỏi đáp IT
  2. Hỏi nhanh

Giúp tìm lỗi bài vòng số nguyên tố

355 Lượt xem 6 Bình luận 0 Lượt báo xấu

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.
Câu trả lời

- Bạn đã sẵn sàng thảo luận về chủ đề này. Hãy bấm "Viết bình luận", bạn có thể lựa chọn sử dụng tài khoản Facebook hoặc Google++

- Vì sự phát triển của cộng đồng CNTT/CNPM tại Việt Nam!

Unknown user
No responses yet


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

0 Lượt thích

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
0 Lượt thích

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ứ.
0 Lượt thích

xem giúp mình đoạn vsnt với update
0 Lượt thích

  • 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
0 Lượt thích

Từ khóa tìm kiếm

Câu trả lời mới nhất

Tin tuyển dụng