Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Вычисление целых корней приведённого


Автор: Stroks 18.10.2006, 20:53
Мне с утра нужно сдать задачу на паскале, а я даже не представляю как это делать. Сам пытался, честно  . Я в программировании просто ничего НЕ ПОНИМАЮ (подскажите хороший учебник, хочу выучить). Хотя это абсолютно простая задача для 11 или 10-го класса.
Задача:
"Вычислите целые корни уравнения x^n + a1*x^(n-1) + a2*x^(n-2) + ... + an = 0 с целыми коэффициентами (an неравен нулю). Эти корни следует искать среди всевозможных делителей числа an." 
Число "n" (степень уравнения (а следовательно и число коэффициентов)) не больше 20 и задаётся с клавиатуры. Все коэффициенты задаются с клавиатуры. (коэффициенты - это a1,a2,...,an)"


Задача спокойно решается с помощью бумаги и ручки, но вот как перевести её в Паскаль....
Вот 2 небольших алгоритма, которые мне пришли в голову: 
1) находим все делители числа an, далее идёт следующая операция: если при подставлении этого числа в уравнение (на место икса), оно обращается в "0", то тогда это число выводится на экран. Если нет - берётся следующий делитель.
2) производятся действия первого алгоритма, только в обратном порядке 

Умоляю, напишите полный текст такой программы. 
И ещё, буду благодарен, если вы мне обьясните, как работают и для чего предназначены её элементы.

Желательно стучать в аську - 303727275

 smile

Автор: Palladin 18.10.2006, 21:50
Вот что-то такое, может и не правильно smile 

Код

program RooR;
var
a,b:array[1..20]of integer;
i,n,j,x,k:integer;
s:real;
begin
Write('Vvedite kol-vo elementov:  ');
Readln(n);
Write('Vvedite x: ');
Readln(x);
for i:=1 to n do
begin
Write('A[',i,']= ');
Readln(a[i]);
end;

s:=exp(n*ln(x));
j:=1;
for i:=1 to n do
begin
s:=s+a[i]*exp(n-1*ln(x));
if s=0 then
begin
b[j]:=a[i];
j:=j+1;
end;
end;
if j=1 then Writeln('NET deliteley!!!');
if j>1 then Writeln('Prostie deliteli est: ');

for k:=1 to j do
Write(b[j],'  ');
readln;
end.


Автор: Alexeis 18.10.2006, 21:50

M
alexeis1
Модератор: Название темы должно отражать ее суть!

Автор: Palladin 18.10.2006, 23:08
Вот переделал, задание просто, вернее я, математику не помнюsmile

Код

program RooR;
var
a,b,c:array[1..20]of integer;
i,n,j,k,u:integer;
s:real;
begin
Write('Vvedite kol-vo elementov:  ');
Readln(n);
for i:=1 to n do
begin
Write('A[',i,']= ');
Readln(a[i]);
end;
b[1]:=1;
j:=2;
if (n mod 2)=0 then begin b[j]:=2; j:=j+1; end;
if (n mod 3)=0 then begin b[j]:=3; j:=j+1; end;
if (n mod 5)=0 then begin b[j]:=5; j:=j+1; end;
if (n mod 7)=0 then begin b[j]:=7; j:=j+1; end;
if (n mod 11)=0 then begin b[j]:=11; j:=j+1; end;
if (n mod 13)=0 then begin b[j]:=13; j:=j+1; end;
if (n mod 17)=0 then begin b[j]:=17; j:=j+1; end;
if (n mod 19)=0 then begin b[j]:=19; j:=j+1; end;
k:=j;
if k<>0 then
begin
for j:=1 to k-1 do
begin
s:=0;
for i:=1 to n do
begin
s:=s+a[i]*exp((n-i)*ln(b[j]));
end;
if s=0 then begin u:=u+1; c[u]:=b[j]; end;
end;
end;
if u=0 then Writeln('Korney net');

if u>0 then Writeln('korni est:');

for i:=1 to u do
Write(c[u]);

Readln;
end.

Автор: Stroks 18.10.2006, 23:19
Задача решена, спасибо ОГРОМНОЕ RooR'у. Я бы "+" поставил, но не могу... smile 

Закрывайте

Автор: Alexeis 18.10.2006, 23:29
 
Цитата

Я бы "+" поставил, но не могу...

Я уже телепатировал и поставил заранее  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)