Даны числа a0 a1 a2 a3 a4 a5
Составить многочлен шестой степени (x-a0)(x-a1)(x-a2)(x-a3)(x-a4)(x-a5)
Добавлено через 1 мин.
думал много над ней.. передо мной была сложность одна.. .когда раскрываешь скобки образуются всевозможные комбинации с двумя а потом с тремя , четырьми... для комбинаций с двумя а придумал...а когда идут 3 , 4.. че то додуматься не могу... помогите пожалуйста
Тебе надо математическое решение?
cам точно не уверен думаю в ответе должно быть так... x6+число*х5... и так далее
Напиши 2 процедуры: умножения и сложения многочленов ( в качестве начального примера можно взять вот это: http://forum.pascal.net.ru/index.php?s=&showtopic=14845&view=findpost&p=86016 ), и перемножай в цикле многочлены...
Нужно сделать:
- тип для представления многочлена (как массива);
- процедуру для умножения;
- ну и для вывода.
Вот, примерно так:
const
n=6;
e=1e-7;
type
tPoly= array[0..n]of double;
procedure Product(p,q: tPoly; var r: tPoly);
var
i,j: integer;
begin
for i:=0 to n do r[i]:=0;
for i:=0 to n do for j:=0 to n-i do r[i+j]:=r[i+j]+p[i]*q[j]
end;
procedure Show(p: tPoly);
var
i: integer;
begin
for i:=0 to n do
if Abs(p[i])>e then begin
if p[i]<0 then Write('-') else if i>0 then Write('+');
if Abs(Abs(p[i])-1)>e then Write(Abs(p[i]):4 :2);
if i>0 then Write('x');
if i>1 then Write('^',i)
end
end;
const
a: tPoly= (2,-1,0,0,0,0,0); {2-x}
b: tPoly= (2,1,0,0,0,0,0); {2+x}
var
c: tPoly;
i: integer;
begin
Product(a,b,c);
Show( c );
ReadLn
end.
const
a: array[1..6]of tPoly= (
(0,1,<-a1>,0,0,0),
(0,1,<-a2>,0,0,0),
(0,1,<-a3>,0,0,0),
(0,1,<-a4>,0,0,0),
(0,1,<-a5>,0,0,0),
(0,1,<-a6>,0,0,0)
);
Не удержался - сделал вывод поизящнее:
const
n=6;
e=1e-7;
type
tPoly= array[0..n]of double;
procedure Product(p,q: tPoly; var r: tPoly);
var
i,j: integer;
begin
for i:=0 to n do r[i]:=0;
for i:=0 to n do for j:=0 to n-i do r[i+j]:=r[i+j]+p[i]*q[j]
end;
function Show(p: tPoly): string;
var
i: integer;
s,t: string;
begin
s:='';
for i:=0 to n do
if Abs(p[i])>e then begin
if p[i]<0 then s:=s+'-' else if i>0 then s:=s+'+';
if Abs(Abs(p[i])-1)>e then begin
Str(Abs(p[i]):4 :2,t);
s:=s+t
end;
if i>0 then s:=s+'x';
if i>1 then begin
Str(i,t);
s:=s+'^'+t
end
end;
Show:=s
end;
const
a: tPoly= (2,-1,0,0,0,0,0); {2-x}
b: tPoly= (2,1,0,0,0,0,0); {2+x}
var
c: tPoly;
i: integer;
begin
Product(a,b,c);
WriteLn('('+Show(a)+')'+'('+Show(b)+')='+Show©);
ReadLn
end.
Извини Lapp немного застрял с организацией цикла
const
{a: tPoly= (3,1,0,0,0,0,0); {2-x}
{b: tPoly= (3,1,0,0,0,0,0); {2+x}
a: array [1..6] of tPoly=
(
(2,1,0,0,0,0,0),
(1,1,0,0,0,0,0),
(3,1,0,0,0,0,0),
(4,1,0,0,0,0,0),
(5,1,0,0,0,0,0),
(1,1,0,0,0,0,0)
);
var
c: tPoly;
i: integer;
begin
clrscr;
for i:=1 to 6 do
begin
Product(c,a[i],c);
WriteLn('('+Show(a)+')'+'('+Show(b)+')='+Show©);
end;
ReadLn
end.
const
n=6;
e=1e-7;
type
tPoly= array[0..n]of double;
procedure Product(p,q: tPoly; var r: tPoly);
var
i,j: integer;
begin
for i:=0 to n do r[i]:=0;
for i:=0 to n do for j:=0 to n-i do r[i+j]:=r[i+j]+p[i]*q[j]
end;
function Show(p: tPoly): string;
var
i: integer;
s,t: string;
f: boolean;
begin
s:='';
f:=true;
for i:=n downto 0 do
if Abs(p[i])>e then begin
if p[i]<0 then s:=s+'-' else if (i<n)and not f then s:=s+'+';
if (i=0)or(Abs(Abs(p[i])-1)>e) then begin
Str(Abs(p[i]): 8: 2,t);
while t[1]=' ' do Delete(t,1,1);
while t[Length(t)]='0' do Delete(t,Length(t),1);
if t[Length(t)]='.' then Delete(t,Length(t),1);
s:=s+t
end;
if i>0 then s:=s+'x';
if i>1 then begin
Str(i,t);
s:=s+'^'+t
end;
f:=false
end;
Show:=s
end;
const
c: tPoly=(1,0,0,0,0,0,0);
a: array [1..6] of tPoly=(
(-2,1,0,0,0,0,0),
(-1,1,0,0,0,0,0),
(-3,1,0,0,0,0,0),
(-4,1,0,0,0,0,0),
(-5,1,0,0,0,0,0),
(-1,1,0,0,0,0,0)
);
var
i: integer;
begin
for i:=1 to 6 do begin
Product(c,a[i],c);
Write('('+Show(a[i])+')')
end;
WriteLn(' = '+Show©);
ReadLn
end.
да я понял, просто пробовал различные варианты,разбирался так скажем..а код мне в принципе ясен и сама идея)) сейчас посмотрю ещё разик)
Добавлено через 11 мин.
Спасибо Большое за проделанную работу!!! Но единственное не совсем понятна эта работа со строками. Будьте добры объясните пожалуйста
for i:=n downto 0 do
if Abs(p[i])>e then begin
if p[i]<0 then s:=s+'-' else if (i<n)and not f then s:=s+'+';
if (i=0)or(Abs(Abs(p[i])-1)>e) then begin
Str(Abs(p[i]): 8: 2,t);
while t[1]=' ' do Delete(t,1,1);
while t[Length(t)]='0' do Delete(t,Length(t),1);
if t[Length(t)]='.' then Delete(t,Length(t),1);
s:=s+t
end;
// весь вывод осуществляем в строку s
for i:=n downto 0 do // выводим в обратном порядке, от больших степеней к маленьким
// нулевые члены не выводим; проверка на ноль для действительных чисел делается сравнением с маленьким числом
if Abs(p[i])>e then begin
// знак выводим отдельно
// если это самый первый член (признак f, от first), и он положительный, то знак + опускаем
// (у меня сейчас возникло подозрение, что условие i<n - лишнее. Проверь)
if p[i]<0 then s:=s+'-' else if (i<n)and not f then s:=s+'+';
// знак вывели, дальше работаем только с модулем.
if (i=0)or(Abs(Abs(p[i])-1)>e) then begin // единицу при степени х не выводим (кроме нулевой степени)
Str(Abs(p[i]): 8: 2,t); // переводим коэффициент в строку t
while t[1]=' ' do Delete(t,1,1); // если t имеет пробелы в начале - удаляем
while t[Length(t)]='0' do Delete(t,Length(t),1); // удаляем завершающие незначащие нули (после точки)
if t[Length(t)]='.' then Delete(t,Length(t),1); // если в конце стоит точка - удаляем
s:=s+t // дописываем значение к знаку
end;
// дальше идет вывод х (везде, кроме нулевой степени)
// потом вывод показателя степени (начиная со второй)
// и сброс признака f в false
спасибо вам большое! правда ваше сообщение увидел тока щас , но программу сдал... немного импровизации и юмора помогло... Вообщем спасибо за труды , хорошие вы люди. буду почаще здесь бывать... помощь вам надеюсь не будет лишней