Домашние задания: Информатика

Вычислить произведение двухзначных чисел которые при делении на 4 дают в остатке 3. Что здесь не так?

Var x,p:integer;
begin
p:=1;
for x:=10 to 99 do
if x mod 4=3 then p:=p*x;
writeln(p);
end.

В итоге мне выбивает число -269060761 почему?
Даже тип p на int64 не справляется
Попробовал..

Var
x:integer;
p:int64;
begin
p:=1;
for x:=10 to 99 do
if x mod 4=3 then p:=p*x;
writeln(p);
end.

Не то, должно оканчиваться на 5, но это не так.
Сергей Мельничук
Сергей Мельничук
88 268
Лучший ответ
Олеся Алексеева Можно было и не пробовать, а немного подумать:

1) Меньше 100 таких чисел 25.
2) Меньше 10 таких чисел 2.
3) Остаётся 23 двузначных числа.
4) При перемножении 23 двузначных чисел должно получиться от 24 до 46 значащих цифр.
5) int64 — это 19 значащих цифр
Потому, что у вас должно получиться очень большое число,
в котором 39 значащих цифр.

Ну не лезет оно в переменную типа integer, значения которого могут быть только от -2147483648 и до 2147483647…
Ирина Тарасова Тогда сделаю int64 и норм будет, спасибо
type bigint = class
private
digits: List;
public
constructor Create; // По умолчанию
begin
self.digits := new List;
end;
constructor Create(s: string); // Из строки
begin
self.digits := new List;
for var i := s.Length downto 1 do self.digits.Add(s[i].ToDigit);
end;
static procedure operator*=(var x: bigint; a: integer);
begin
if a = 0 then begin x.digits.RemoveAll(x -> true); x.digits.Add(0); end;
var y := x;
for var i := 1 to a-1 do x := x + y;
end;
static function operator+(x, y: bigint): bigint;
var z := new bigint;
var d: integer; // Перенос в старший разряд
begin
while x.digits.Count <> y.digits.Count do // Дополнить нулями до размера
if x.digits.Count < y.digits.Count then x.digits.Add(0)
else y.digits.Add(0);
for var i := 0 to x.digits.Count-1 do // Сложение
if x.digits[i] + y.digits[i] + d < 10 then begin // Без переноса
z.digits.Add(x.digits[i] + y.digits[i] + d);
d := 0;
end
else begin // С переносом
z.digits.Add((x.digits[i] + y.digits[i] + d) mod 10);
d := 1;
end;
if d > 0 then z.digits.Add(d); // Добавить разряд
while x.digits.Item[x.digits.Count-1] = 0 do // Убрать нули в начале
x.digits.RemoveAt(x.digits.Count-1);
while y.digits.Item[y.digits.Count-1] = 0 do
y.digits.RemoveAt(y.digits.Count-1);
Result := z;
end;
function ToString: string; override;
var s: string;
begin
for var i := self.digits.Count-1 downto 0 do s += self.digits[i];
Result := s;
end;
end;
begin
var p := new bigint('1');
for var x := 10 to 99 do
if x mod 4 = 3 then p *= x;
p.ToString.Println;
end.
Татьяна Алтынникова Тупо, медленно и стрёмно.. Но в рамках данной задачи подойдет.
Татьяна Алтынникова Какой это класс, кстати? Для школы не так уж и просто..

Похожие вопросы