88
56
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
2901
1826
Để kiểm tra 2 số có phải số bạn bè hay không, ta chỉ cần xét một số, nếu tổng các ước của tổng các ước của số đó bằng số đó thì 2 số đó là số bạn bè. Nói đơn giản là i == sd(sd(i)) với sd(n) là hàm tính tổng các ước thực sự của n.
Do phải lặp lại K lần, độ phức tạp của chương trình là O(KsqrtK).
$\\$
$\\$
Lưu ý: Đoạn code dưới đây chỉ mang tính chất tham khảo.
var k,i,v:longint;
function sd(n:longint):longint;
var res,i:longint;
begin
res:=0;
for i:=1 to trunc(sqrt(n)) do begin
if n mod i = 0 then begin
res:=res+i;
if (i*i<>n)and(i<>1) then res:=res+n div i;
end;
end;
exit(res);
end;
begin
readln(k);
for i:=1 to k do begin
v:=sd(i);
if (sd(v)=i) and (i<v) then writeln(i, ' ', v);
end
end.
$\\$
$\\$
$\color{#ffd710}{\texttt{\{}} \color{#8655d6}{\texttt{\{}}\ \ \color{#8cdcda}{\text{Daoanhviet96}}\ \ \color{#8655d6}{\texttt{\}}} \color{#ffd710}{\texttt{\}}}$
Hãy giúp mọi người biết câu trả lời này thế nào?
8000
4536
uses crt;
var sum: array[1..20000] of longint;
function getSum(n: longint): longint;
var s,i: longint;
begin
i := 1;
s := 0;
while i <= sqrt(n) do
begin
if n mod i = 0 then
if (n / i) = i then s := s + i
else s := s + i + (n div i);
inc(i);
end;
exit(s - n);
end;
var i,k,count: longint;
begin
readln(k);
count := 0;
for i := 1 to 20000 do sum[i] := getSum(i);
for i := 1 to k do
if (1 <= sum[i]) and (sum[i] <= 20000) then
if (sum[sum[i]] = i) and (sum[i] > i) then
begin
inc(count);
writeln(i, ' ', sum[i]);
end;
if count = 0 then write(0);
end.
$\\$
`\bb\color{#3a34eb}{\text{@hoanganhnguyen09302}}`
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin
2901
47598
1826
Lúc đầu code lỗi, và t sửa một cái quái gì đó và code chạy được, từ chối hiểu :v