Даны числа a0 a1 a2 a3 a4 a5 Составить многочлен шестой степени (x-a0)(x-a1)(x-a2)(x-a3)(x-a4)(x-a5)
Добавлено через 1 мин. думал много над ней.. передо мной была сложность одна.. .когда раскрываешь скобки образуются всевозможные комбинации с двумя а потом с тремя , четырьми... для комбинаций с двумя а придумал...а когда идут 3 , 4.. че то додуматься не могу... помогите пожалуйста
sheka
21.12.2009 23:24
Тебе надо математическое решение?
Рустам
22.12.2009 5:20
cам точно не уверен думаю в ответе должно быть так... x6+число*х5... и так далее
volvo
22.12.2009 10:07
Напиши 2 процедуры: умножения и сложения многочленов ( в качестве начального примера можно взять вот это: Задача на многочлены ), и перемножай в цикле многочлены...
Lapp
22.12.2009 10:58
Нужно сделать: - тип для представления многочлена (как массива); - процедуру для умножения; - ну и для вывода.
Вот, примерно так:
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;
beginfor i:=0to n do r[i]:=0;
for i:=0to n dofor j:=0to n-i do r[i+j]:=r[i+j]+p[i]*q[j]
end;
procedure Show(p: tPoly);
var
i: integer;
beginfor i:=0to n doif Abs(p[i])>e thenbeginif p[i]<0thenWrite('-') elseif i>0thenWrite('+');
if Abs(Abs(p[i])-1)>e thenWrite(Abs(p[i]):4 :2);
if i>0thenWrite('x');
if i>1thenWrite('^',i)
endend;
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.
Тут для примера производится умножение (2-х)(2+х). Запусти и убедись, что оно равно 4-х2. А для твоей задачи лучше всего создать массив из специально заполненных полиномов. Примерно такой:
Либо, если числа заранее неизвестны, то запрашивай их в цикле и ставь на нужные места. Если что неясно - спрашивай.
Добавлено через 1 мин. Извиняюсь, volvo, форму ответа давно загрузил..
Добавлено через 1 мин.
Цитата(volvo @ 22.12.2009 10:07)
Напиши 2 процедуры: умножения и сложения многочленов
Сложение в данном случае не нужно )).
Lapp
22.12.2009 12:30
Не удержался - сделал вывод поизящнее:
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;
beginfor i:=0to n do r[i]:=0;
for i:=0to n dofor j:=0to 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:=0to n doif Abs(p[i])>e thenbeginif p[i]<0then s:=s+'-'elseif i>0then s:=s+'+';
if Abs(Abs(p[i])-1)>e thenbegin
Str(Abs(p[i]):4 :2,t);
s:=s+t
end;
if i>0then s:=s+'x';
if i>1thenbegin
Str(i,t);
s:=s+'^'+t
endend;
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(c));
ReadLn
end.
volvo
22.12.2009 12:35
Цитата
Сложение в данном случае не нужно )).
В "данном" - это в каком? Естественно, если ты объединил умножение и сложение, тебе сложение отдельно не надо. Я предпочитаю, чтоб мои процедуры выполняли строго определенную задачу: сложение - это сложение, умножение - это умножение. Принцип "Разделяй и властвуй" в действии...
Рустам
22.12.2009 13:56
Извини 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:=1to6dobegin
Product(c,a[i],c);
WriteLn('('+Show(a)+')'+'('+Show(b)+')='+Show(c));
end;
ReadLn
end.
скажи правильно ли я делаю. чтобы перемножить 6 множителей надо каждый множитель умножать на результат Product(c,a[i],c); но для начала надо присвоить с как бы единицу то есть c:=(1,0,0,0,0,0,0) но такой вариант че то паскалю не нравится?
Lapp
22.12.2009 14:49
Цитата(Рустам @ 22.12.2009 13:56)
чтобы перемножить 6 множителей надо каждый множитель умножать на результат Product(c,a[i],c); но для начала надо присвоить с как бы единицу то есть c:=(1,0,0,0,0,0,0) но такой вариант че то паскалю не нравится?
Все вроде правильно. Что именно ему не нравится? Скажи, что за ошибка.
Добавлено через 2 мин. только ты понял, что в первые элементы нужно заносить не "ai", а "-ai" ?
Добавлено через 10 мин. Я заметил некоторые недочеты (и даже одну ошибку ) в выводе.. Кроме этого, я перевернул вывод - теперь старший член идет первым (как обычно). Вот исправленный вариант полностью:
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;
beginfor i:=0to n do r[i]:=0;
for i:=0to n dofor j:=0to 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 downto0doif Abs(p[i])>e thenbeginif p[i]<0then s:=s+'-'elseif (i<n)andnot f then s:=s+'+';
if (i=0)or(Abs(Abs(p[i])-1)>e) thenbegin
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>0then s:=s+'x';
if i>1thenbegin
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;
beginfor i:=1to6dobegin
Product(c,a[i],c);
Write('('+Show(a[i])+')')
end;
WriteLn(' = '+Show(c));
ReadLn
end.
(и еще одно исправление в Show.. Надеюсь, теперь все Ок))
Рустам
22.12.2009 15:48
да я понял, просто пробовал различные варианты,разбирался так скажем..а код мне в принципе ясен и сама идея)) сейчас посмотрю ещё разик)
Добавлено через 11 мин. Спасибо Большое за проделанную работу!!! Но единственное не совсем понятна эта работа со строками. Будьте добры объясните пожалуйста
for i:=n downto0doif Abs(p[i])>e thenbeginif p[i]<0then s:=s+'-'elseif (i<n)andnot f then s:=s+'+';
if (i=0)or(Abs(Abs(p[i])-1)>e) thenbegin
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;
Lapp
23.12.2009 5:12
Цитата(Рустам @ 22.12.2009 15:48)
Спасибо Большое за проделанную работу!!! Но единственное не совсем понятна эта работа со строками. Будьте добры объясните пожалуйста
Вообще-то, это не совсем относится к самой задаче. Если тебе неясно или не нравится, ты можешь выводить так, как считаешь нужным. Но объяснить тоже нетрудно ))..
Собственно, почти все сложности проистекают из-за того, что ты не сказал, какие значения могут принимать ai - любые или только целые. С целыми все было бы гораздо проще. Но я сделал для действительных, причем если дробная часть равна нулю - она не выводится (как обычно люди пишут). Так что при сдаче можешь блестнуть выводом дробных значений (только проверь сначала как следует).
// весь вывод осуществляем в строку s
for i:=n downto0do// выводим в обратном порядке, от больших степеней к маленьким
// нулевые члены не выводим; проверка на ноль для действительных чисел делается сравнением с маленьким числом
if Abs(p[i])>e thenbegin// знак выводим отдельно
// если это самый первый член (признак f, от first), и он положительный, то знак + опускаем
// (у меня сейчас возникло подозрение, что условие i<n - лишнее. Проверь)
if p[i]<0then s:=s+'-'elseif (i<n)andnot f then s:=s+'+';
// знак вывели, дальше работаем только с модулем.
if (i=0)or(Abs(Abs(p[i])-1)>e) thenbegin// единицу при степени х не выводим (кроме нулевой степени)
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
Вот, вроде, и вся наука )).
Рустам
24.12.2009 22:05
спасибо вам большое! правда ваше сообщение увидел тока щас , но программу сдал... немного импровизации и юмора помогло... Вообщем спасибо за труды , хорошие вы люди. буду почаще здесь бывать... помощь вам надеюсь не будет лишней
Lapp
24.12.2009 22:13
Цитата(Рустам @ 24.12.2009 22:05)
спасибо за труды , хорошие вы люди. буду почаще здесь бывать... помощь вам надеюсь не будет лишней
Приятно помочь в добром деле )). Конечно, заходи - всегда рады!
Добавлено через 6 мин.
Цитата(volvo @ 22.12.2009 12:35)
В "данном" - это в каком? Естественно, если ты объединил умножение и сложение, тебе сложение отдельно не надо. Я предпочитаю, чтоб мои процедуры выполняли строго определенную задачу: сложение - это сложение, умножение - это умножение. Принцип "Разделяй и властвуй" в действии...
Извиняюсь, только сейчас увидел этот пост. Ты имеешь в виду реализацию умножения столбиком? В принципе я согласен, конечно, но тут действительно просто рука не поднялась разводить всю кухню, когда все помещается в один цикл.. ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.