Другие языки программирования и технологии

Сложное уравнение (ax+b)/(cx+d)=0 на Pascal

Решить в целых числах уравнение ( ax + b ) : ( cx + d ) = 0. Вводятся 4 числа: a, b, c и d; c и d не равны нулю одновременно. Необходимо вывести все решения, если их число конечно, “NO” (без кавычек) , если решений нет, и “INF” (без кавычек) , если решений бесконечно много.

Пояснения:
Если a=c и b=d или a=0 и b<>0, то уравнение не имеет решений. Если a=0 и b=0, то уравнение имеет бесконечно много решений. И последний случай: если a<>0, то находим корень, проверяем, является ли он целым числом, и проверяем, не получится ли 0 в знаменателе. Если все условия выполняются - выводим корень, если нет - уравнение не имеет решений.

Сделал 2 варианта.. . оба работают но не во всех случаях.

1. program zadanieO;
var a,b,c,d:integer;
begin
readln(a);
readln(b);
readln(c);
readln(d);
if (c<>0) and (d<>0) then
if ((a=c) and (b=d)) or ((a=0) and (b<>0)) then writeln('NO')
else if ((a=0) and (b=0)) and (((-d)/c)<>0) then writeln('INF')
else if (a<>0) then
if (-b mod a = 0) and (((-d)/c)<>0) then writeln(-b div a)
else writeln('NO');
end.

2. program zadanieO;
var a,b,c,d:integer;
begin
readln(a);
readln(b);
readln(c);
readln(d);
if (c<>0) and (d<>0) then
begin
if (a=0) and (b=0) and ((c*((-d)/c)-d)<>0) then writeln('INF')
else if ((a=0) or (a*d = b*c)) and ((c*((-d)/c)-d)<>0) then writeln('NO')
else if (b div a * a = b) and ((c*((-d)/c)-d)<>0) then writeln(-b div a)
else writeln('NO');
end;
end.
Одной строкой:
if a = 0 then if b = 0 then result := 'INF' else result := 'NO' else if -b*c/a+d = 0 then result := 'NO' else result := Str(-b/a)
Ответ Зла всем хорош, только не учитывает случай a=0
АС
Алексей Савельев
4 748
Лучший ответ
А ты уверен, что алгоритм в пояснениях верен?
ведь это же всего лишь система
ax+b = 0
cx+d != 0

у ax+b = 0 1 корень.
его нашел, подставил во второе, проверил.
Что-то, да, сильно сложное уравнение. А если бы пришлось что-нибудь совсем навороченное, с радикалами там или еще какими логарифмами анализировать? Совсем ведь утонуть во всех этих IF-ах можно.

Может быть, поступить так? Ввести дополнительную переменную, result, и при помощи нее избавиться от вложенных проверок? Например:

VAR result :String;
...
result := '';

IF (c = 0) and (d = 0) THEN result := 'NO';

IF (result = '') THEN
IF (a = c) and (b = d) THEN result := 'NO';

IF (result = '') THEN
IF (a = 0) and (b <> 0) THEN result := 'NO';

IF (result = '') THEN
IF (a = 0) and (b = 0) THEN result := 'INF';

IF (result = '') THEN
IF (d-c*(b div a) = 0) THEN result := 'NO';

IF (result = '') THEN
IF (b mod a = 0) THEN Str(result, - b div a);

IF (result = '') THEN result := 'Ваще в непонятках';

WriteLn(result);
Валерий Арьков
Валерий Арьков
24 825