Всем привет!
У меня есть задача:
Нужно подсчитать сумму всех счестливых числел в промежутке [a;b].
Счастливые числа - числа которые состоят только из 4 и 7
например
Входные данные:
5 49
Выходные данные:
98
(7+44+47=98)
1 <= A <= B <= 1000000000 (10^9)
Вот моё решение:
{$n+}
program my;
var a,b,i : longint;
sum : extended;
function isLucky(c : longint) : boolean;
var s : string;
i,r : integer;
begin
r := 0;
str(c,s);
for i := 1 to length(s) do
if (s[i]= '7') or(s[i]='4') then
inc®;
if r = length(s) then
isLucky := true
else
islucky := false;
end;
begin
sum := 0;
readln(a,b);
if a < 4 then
a:=4;
if b > 77777777 then
b := 77777777;
for i := a to b do
if isLucky(i) = true then
sum := sum+i;
writeln(sum:1:0);
end.
Во-первых, избавляешься от преобразования числа в строку. Это ОЧЕНЬ медленно...
function isLucky(c: longint) : boolean;
begin
islucky := false;
while c > 0 do begin
if not ((c mod 10) in [4, 7]) then exit;
c := c div 10;
end;
islucky := true;
end;
var a,b,i : longint;Разберешься, почему именно так, или объяснить? Результаты работы твоей и моей программы совпадают...
sum : extended;
function isLucky(c: longint) : boolean;
begin
islucky := false;
while c > 0 do begin
if not ((c mod 10) in [4, 7]) then exit;
c := c div 10;
end;
islucky := true;
end;
var d: integer;
begin
sum := 0;
i := a;
while not ((i mod 10) in [4, 7]) do inc(i);
if i mod 10 = 4 then d := 3 else d := 7;
while i <= b do begin
if isLucky(i) = true then sum := sum + i;
inc(i, d);
d := 10 - d;
end;
writeln(sum:1:0);
end.
program my;
var
a,b: longint;
sum : extended;
procedure sum_lucky(n: longint);
begin
if (n >= a) and (n <= b) then sum := sum + n;
if n > b div 10 then exit;
sum_lucky(10*n + 4);
sum_lucky(10*n + 7);
end;
begin
readln(a, b);
if a < 4 then a := 4;
if b > 777777777 then b := 777777777;
sum := 0;
sum_lucky(0);
writeln(sum:1:0);
end.
М | Witaliy, пожалуйста, срочно приведи название темы в соответствие с Правилами. |
ОЧЕНЬ большое спасибо всем! Даже не думал что так просто можно это сделать)
У меня еще есть такая задача:
Счастливые числа єто те числа, которые делятся одновременно и на x и на y и на z
Найти все такие числа в промежутке [a;b].
Например
2 3 4
12 24
Результат: 2
(это числа 12, 24).
Вот мой код:
program my;
var x,y,z,a,b,i,res : longint;
function is_Lucky(c : longint): boolean;
begin
if (c mod x = 0) and (c mod y = 0) and (c mod z = 0) then
is_Lucky := true
else
is_Lucky := false;
end;
begin
readln(x,y,z);
readln(a,b);
res := 0;
for i := a to b do
if is_Lucky(i)= true then
inc(res);
writeln(res);
end.
Я, конечно, могу ошибаться, но мне почему-то кажется, что можно вообще выбросить цикл за ненадобностью:
writeln(((b - a) div LCМ(x, y, z)) + 1);выдаст тебе нужный результат... LCM - это Least Common Multiple - наименьшее общее кратное чисел (НОК)... Как находится НОК было на форуме неоднократно, ищи...
Извините, искал, но не нашло... если можете, дайте ссилку... спасибо.
Такой вариант не пройдёт, неверные ответы. Нужно как-то оптимизировать мой код.
Я здаю задачу на контестер, и не знаю какие входные данные там должны быть
Ну, в таком случае тебе ее и решать, для контестера... А то очень мудрые все стали: "Кто-то решает, а кто-то сдает"...