// pascalabc.net 3.2, сборка 1417 от 28.03.2017 // внимание! если программа не работает, обновите версию! type fraction=(integer,integer); function ratfact(self: array of integer): sequence of fraction; extensionmethod; // // на основе алгоритма 78б // в кн.: агеев м.и., алик в.п., марков ю.и. // библиотека алгоритмов 51б-100б. (справочное пособие.) вып.2. // м.б "сов. радио", 1976. // // отыскание рациональных корней полиномов с целыми коффициентами. // используется предоженное дж.пеком расширение вычисления полинома // методом горнера. // ! коэффициенты полинома записываются, начиная со свободного члена ! // begin var l: =new list< fraction> ; // вынужденное: метод иногда дает дубликаты (var a0, var an): =(abs(self.first),abs(self.last)); for var p: =1 to a0 do begin if a0 mod p< > 0 then continue; for var q: =1 to an do begin if an mod q< > 0 then continue; var g: =self.first; (var f, var t): =(g,p); foreach var k in self.skip(1) do begin var r: =k*t; (f,g,t): =(f*q+r,-g*q+r,t*p); end; if f=0 then l.add((p,q)); if g=0 then l.,q)) end end; result: =l end; function redfrac(self: fraction): fraction; extensionmethod; begin (var p,var q): =self; var s: =sign(p*q); (p,q): =(abs(p),abs(q)); (var a,var b): =(p,q); while b< > 0 do begin a: =a mod b; swap(a,b) end; result: =(s*p div a,q div a) end; function beautify(self: sequence of fraction): sequence of string; extensionmethod; begin result: =self.select(e-> e.redfrac).distinct.orderby(x-> x[0]/x[1]). select(e-> e[0]+(e[1]< > 1? '/'+e[1]: '')) end; begin readarrinteger(4).ratfact.beautify.println end. примеры 1) -36x³+3x²+14x+3 = 0 3 14 3 -36 -1/3 3/4 2) (x-1)(x+2)(x+3/5) = 0; 5x³+8x²-7x-6 = 0 -6 -7 8 5 -2 -3/5 1
Yeremeev
22.04.2022
// pascalabc.net 3.2, сборка 1417 от 28.03.2017// внимание! если программа не работает, обновите версию! function sumd(k: integer): integer; begin result: =0; while k> 0 do (result,k): =(result+k mod 10,k div 10)end; function good(k,s: integer): boolean; begin var p: =1; while k> 0 do (p,k): =(p*(k mod 10),k div 10); result: =p=send; begin var n: =readinteger('n='); var s: =sumd(n); range(1,n-1).where(n-> good(n,end. пример n= 44 8 18 24 42