Mật khẩu bạn Nam sử dụng để truy cập vào trang web học trực tuyến là một số nguyên tố có tổng các chữ số là một số chẵn. Thay vì ghi lại mật khẩu này, bạn Nam chỉ ghi lại một số nguyên 𝑛 có giá trị nhỏ hơn mật khẩu. Yêu cầu: Cho biết số nguyên 𝑛, hãy tìm mật khẩu có giá trị nhỏ nhất trong số các mật khẩu bạn Nam có thể sử dụng. Dữ liệu vào: Đọc từ bàn phím số nguyên 𝑛; Kết quả: Ghi ra màn hình mật khẩu tìm được. Ví dụ: NTO.INP NTO.OUT 20 Mat khau la: 31 1001 Mat khau la: 1009 HAPPY NEW YEAR
2 câu trả lời
Uses crt;
Var
n,i,s,k,kt: integer;
Begin
clrscr;
readln(n);
repeat
n:=n+1; {tăng dần n thành số để xét vì n nhỏ hơn mật khẩu}
kt:=0;
for i:=2 to n-1 do
if n mod i=0 then kt:=1; {Nếu số được xét chia hết cho số nào đó nhỏ hơn => số được xét không phải số nguyên tố => loại}
if kt=0 then {Nếu số được xét không bị loại thì thực hiện}
begin
s:=0; i:=n;
while (i<>0) do {Tính tổng các chữ số của số được xét}
begin
k:=i mod 10;
i:=i div 10;
s:=s+k;
end;
if s mod 2=0 then kt:=2; {Nếu tổng chữ số chia hết cho 2 => chắn => đặt biến kt hợp lệ}
end;
until(kt=2); {Nếu biến kiểm tra hợp lệ (=2) thì không cần phải xét tiếp}
writeln('Mat khau la: ',n);
readln;
End.
- Cách 1: 6k +- 1
uses crt;
type int = longint;
var n: int;
function prime(x: int): boolean;
var i: int;
begin
if x <= 1 then exit(false);
if x mod 2 = 0 then exit(x = 2);
if x mod 3 = 0 then exit(x = 3);
i:=5;
while i * i <= x do begin
if (x mod i = 0) or (x mod (i + 2) = 0) then
exit(false);
inc(i, 6);
end;
exit(true);
end;
function check(x: int): boolean;
var r: int;
begin
if not prime(x) then exit(false);
r:=0;
while x > 0 do begin
inc(r, x mod 10);
x:=x div 10;
end;
exit(r and 1 = 0);
end;
begin
readln(n); inc(n);
while check(n) = false do inc(n);
writeln(n);
end.
- Cách 2: miller - rabin
uses crt;
type int = int64;
var n: int;
var ck_prime: array of int = (2, 7, 61);
function pow(a, n, m: int): int;
var res: int;
begin
res:=1;
while n > 0 do begin
if n and 1 = 1 then res:=(res * a) mod m;
a:=(a * a) mod m;
n:=n shr 1;
end;
exit(res);
end;
function check(a, s, d, n: int): boolean;
var p: int;
begin
if n = a then exit(true);
p:=pow(a, d, n);
if p = 1 then exit(true);
while s > 0 do begin
dec(s);
if p = n - 1 then exit(true);
p:=(p * p) mod n;
end;
exit(false);
end;
function prime(x: int): boolean;
var i, d, s: int;
begin
if x <= 1 then exit(false);
if x mod 2 = 0 then exit(x = 2);
if x mod 3 = 0 then exit(x = 3);
d:=x - 1; s:=0;
while d and 1 = 0 do begin
inc(s);
d:=d shr 1;
end;
for i:=0 to 2 do
if check(ck_prime[i], s, d, x) = false then exit(false);
exit(true);
end;
function check(x: int): boolean;
var r: int;
begin
if not prime(x) then exit(false);
r:=0;
while x > 0 do begin
inc(r, x mod 10);
x:=x div 10;
end;
exit(r and 1 = 0);
end;
begin
readln(n); inc(n);
while check(n) = false do inc(n);
writeln(n);
end.