23.12.2011, 14:36 | #1 (permalink) |
Новичок
Регистрация: 23.12.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Диофантово уравнение
Дано уравнение ах+by=c. Сколько различных пар целых чисел х и у удовлетворяют заданному уравнению? Если бесконечно много - выведите -1. (Это частный случай диофантова уравнения). Вот нашла кое-что на Си ... а паскале как это будет даже представления не имею. Код:
int a, b, c, g, // коэффициенты диофантова уравнения, и g=gcd(a,b) x0, y0, // одно из решений диофантова уравнения x1, x2, // заданный отрезок mx, my; // искомое решение с наименьшим x >= x1 int cnt = (x1 - x0) / (b / g); if (x0 + cnt * (b / g) < x1) ++cnt; mx = x0 + cnt * (b / g); my = y0 - cnt * (a / g); |
23.12.2011, 14:36 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Аналогичные проблемы уже обсуждались ранее Решить дифференциальное уравнение в Паскале C#. Квадратное уравнение |
23.12.2011, 16:41 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Прежде всего, призываю с уважением относиться к одному из величайших математиков в истории человечества - Диофанту Александрийскому, и писать названный в его честь класс уравнений правильно: диофантовы (а не "диафантовы" и не "дифантовы") уравнения. Право, он заслужил этот небольшой знак уважения от далёких потомков.
Теперь по самой задаче. На самом деле там всё просто. Обратите внимание - Вас не просят искать сами решения, а просят лишь ответить на вопрос, сколько их. А таких ответов, как утверждает математика, может быть всего два: или 0, или ∞. И определяется это вот чем: Найдём наибольший общий делитель чисел a и b. Обозначим его gcd. Так вот, если число c делится нацело без остатка на gcd, то решений бесконечно много, а если не делится - то решений нет. Так и построим программу: Код:
VAR a,b,c,r:LongInt; Function Gcd(g1,g2:LongInt):LongInt; {Search for the Greatest Common Divisor} var m,gc:LongInt; begin If g2>g1 then begin m:=g1; g1:=g2; g2:=m; end; gc:=g2+1; Repeat Dec(gc); Until ((g1 mod gc)=0) and ((g2 mod gc)=0); Gcd:=gc; end; BEGIN Write('a= '); Readln(a); Write('b= '); Readln(b); Write('c= '); Readln(c); If (c mod Gcd(a,b))=0 then r:=-1 else r:=0; Writeln('Result: ',r); Readln; END. |
23.12.2011, 23:17 | #3 (permalink) |
Новичок
Регистрация: 23.12.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Мне очень стыдно! Ссори!
Подскажите пожалуйста, как сделать эту задачу через файлы, чтобы а,b,с я могла вводить из входящего файла, а ответ выходило в выходящем файле? Плиииз, очень срочно надо.... |
24.12.2011, 09:18 | #4 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Код:
VAR a,b,c,r:LongInt; f:Text; Function Gcd(g1,g2:LongInt):LongInt; {Search for the Greatest Common Divisor} var m,gc:LongInt; begin If g2>g1 then begin m:=g1; g1:=g2; g2:=m; end; gc:=g2+1; Repeat Dec(gc); Until ((g1 mod gc)=0) and ((g2 mod gc)=0); Gcd:=gc; end; BEGIN Assign(f,'D:\Inp.txt'); Reset(f); Read(f,a,b,c); Close(f); Assign(f,'D:\Outp.txt'); Rewrite(f); If (c mod Gcd(a,b))=0 then r:=-1 else r:=0; Write(f,r); Close(f); END. |
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|