Форум «Всё о Паскале» _ Задачи _ деление двух многочленов
Автор: arximed 6.03.2007 11:52
Нам наш учитель вчера задал такую задачу... Вводяться коэффиценты 2 многочленов и требуеться разделить их друг на друга и вывести коэффиценты получившегося многочлена... помогите составить кратчайший алгоритм...
Автор: Mind 10.03.2007 0:15
Вот мой вариант деления многочленов столбиком.
program Vremya_09_03_07; uses crt; var k1,k2,k3:array[1..100] of real; i,kol1,kol2,j,s1,s2:integer; begin clrscr; repeat write('Vvedite naivysshuu stepen` delimogo: '); readln(kol1); until (kol1 > 0) and (kol1 <= 100); kol1 := kol1 + 1; repeat write('Vvedite naivysshuu stepen` delitelya: '); readln(kol2); until (kol2 >= 0) and (kol2 <= kol1); kol2 := kol2 + 1; writeln('Vvedite koeffichienty delimogo: '); for i := 1 to kol1 do read(k1[i]); writeln('Vvedite koeffichienty delitelya: '); for i := 1 to kol1 do if i <= kol1-kol2 then k2[i] := 0 else read(k2[i]);
j := 0; s1 := 0; repeat s2 := 1; for i := 1 to kol1 do if k2[i] <> 0 then break else s2 := s2 + 1; s1 := s1 + 1; if s2 >= s1 then begin j := j + 1; k3[j] := k1[s1]/k2[s2]; for i := s1 to kol1 do k1[i] := k1[i] - k2[s2+i-s1]*k3[j]; end; until s2 < s1;
writeln('Koeffichienty poluchenogo mnogochlena: '); for i := 1 to s1-1 do write(k3[i]:4 :2,' '); writeln; writeln('Ostatok: '); for i := s1 to kol1 do write(k1[i]:4 :2,' '); readkey; end.
Протестировал. Вроде работает. Там только небольшой глюк в выводе остатка... Ну типо несколько нулей написать лишних может... А так нормально. Главное ответ верный выдаёт. Если найдёшь ошибки сообщи.
Автор: мисс_граффити 10.03.2007 1:50
1. Немножко не компилируется... 2. Глюки есть. Например, если степень делителя больше степени делимого... не дает ввести все коэфф для делителя.
Автор: arximed 10.03.2007 16:19
Цитата(Mind @ 9.03.2007 21:15)
Вот мой вариант деления многочленов столбиком.
program Vremya_09_03_07; uses crt; var k1,k2,k3:array[1..100] of real; i,kol1,kol2,j,s1,s2:integer; begin clrscr; repeat write('Vvedite naivysshuu stepen` delimogo: '); readln(kol1); until (kol1 > 0) and (kol1 <= 100); kol1 := kol1 + 1; repeat write('Vvedite naivysshuu stepen` delitelya: '); readln(kol2); until (kol2 >= 0) and (kol2 <= kol1); kol2 := kol2 + 1; writeln('Vvedite koeffichienty delimogo: '); for i := 1 to kol1 do read(k1[i]); writeln('Vvedite koeffichienty delitelya: '); for i := 1 to kol1 do if i <= kol1-kol2 then k2[i] := 0 else read(k2[i]);
j := 0; s1 := 0; repeat s2 := 1; for i := 1 to kol1 do if k2[i] <> 0 then break else s2 := s2 + 1; s1 := s1 + 1; if s2 >= s1 then begin j := j + 1; k3[j] := k1[s1]/k2[s2]; for i := s1 to kol1 do k1[i] := k1[i] - k2[s2+i-s1]*k3[j]; end; until s2 < s1;
writeln('Koeffichienty poluchenogo mnogochlena: '); for i := 1 to s1-1 do write(k3[i]2,' '); writeln; writeln('Ostatok: '); for i := s1 to kol1 do write(k1[i]2,' '); readkey; end.
Протестировал. Вроде работает. Там только небольшой глюк в выводе остатка... Ну типо несколько нулей написать лишних может... А так нормально. Главное ответ верный выдаёт. Если найдёшь ошибки сообщи.
Bolshoe spasibo ...da qlyuk yest' no toje ispravim
Автор: Mind 11.03.2007 3:17
Цитата
1. Немножко не компилируется...
Ну вообще программа может только либо компилиться, либо нет. Немножко - это реальный прикол! Не в обиду...
Цитата
2. Глюки есть. Например, если степень делителя больше степени делимого... не дает ввести все коэфф для делителя.
Я не рассматривал этот вариант в своей задаче. Это каким таким образом степень делителя может быть больше степени делимого елси я поставил на это ограничение:
Код
repeat write('Vvedite naivysshuu stepen` delitelya: '); readln(kol2); until (kol2 >= 0) and [b](kol2 <= kol1) [/b];
Вот то что жирным посмотри.
З.Ы. Чё в коде жирным выделять нельзя что ли? Я вот имел ввиду вот это: kol2 <= kol1
Автор: arximed 11.03.2007 3:41
Спасибо огромное...я пожправил некоторые пробелы в проге(их было не так уж и много)...
Автор: Mind 11.03.2007 3:52
Цитата
Спасибо огромное...я пожправил некоторые пробелы в проге(их было не так уж и много)...
Да не за что! Мне самому было интересно эту программу сделать, чтобы проверять правильность своего деления многочленов... А какие там ещё были проблемы кроме как вывод остатка парил чуток? Просто самому интересно...
Автор: volvo 11.03.2007 4:02
Цитата
чтобы проверять правильность своего деления многочленов
Для этого надо программу тестировать САМОМУ, а не давать ее как решение для того, чтобы ее тестировали другие...
Автор: мисс_граффити 11.03.2007 4:07
Цитата
Ну вообще программа может только либо компилиться, либо нет. Немножко - это реальный прикол!
Спасибо за пояснение. Я даже не догадывалась! Hint: вообще-то, это цитата была.
Цитата
Это каким таким образом степень делителя может быть больше степени делимого елси я поставил на это ограничение
1. А с какой стати ты отбрасываешь этот случай? Что, правильные дроби не имеют права на существование? 2. Пользователя хоть как-то предупредить - не судьба? Откуда он должен знать, что его вариант ввода степени не прошел? Начинает вводить коэффициенты.... Программа не ругается, все принимает...
volvo, компания Майкрософт тоже так любит делать "Ищите, пользователи, глюки... Сообщайте в суппорт... А мы сервиспаков наделаем..."
Автор: Mind 11.03.2007 4:34
Цитата
Для этого надо программу тестировать САМОМУ, а не давать ее как решение для того, чтобы ее тестировали другие...
Я тестировал сам! Всё работает. Я наверно имею право иногда сомневаться... Я просто так на всякий случай написал. Мало ли какие глюки найдутся... Никто ведь не застрахован от ошибок.
Цитата
. Пользователя хоть как-то предупредить - не судьба? Откуда он должен знать, что его вариант ввода степени не прошел? Начинает вводить коэффициенты.... Программа не ругается, все принимает...
Ну, вообще я думаю это уже оформление... Я не углублялся в оформление. Точнее говоря его там нет вообще. В этом плане там ещё много чё подправить можно. Он ведь алгоритм просил. Ну а уж такие мелкие погрешности можно и самому доработать.
Цитата
1. А с какой стати ты отбрасываешь этот случай? Что, правильные дроби не имеют права на существование?
Конечно правильные дроби имеют право на существование. Я просто не рассматривал этот вариант. Судя по ответу он остался доволен. А это уже более расширенный вариант этой задачи. Может этого вообще не надо было ему? (ну это я так уже просто догадываюсь)
Цитата
volvo, компания Майкрософт тоже так любит делать "Ищите, пользователи, глюки... Сообщайте в суппорт... А мы сервиспаков наделаем..."
Ох, насмешила. А правда ведь. Но я ни такой на самом деле... Так получилось. Не убивайте меня...
Автор: Perfez 17.03.2007 10:00
Буду выступать в виде заключителя (или может злоключителя) Вот прекрасно работающий исправлённый вариант кода Mind-a(Спасибо!):
var ar1,ar2,ar3:array[1..100] of real; i,kol1,kol2,j,k,l:integer;
writeln('Vvedite koeffichienty delimogo: '); for i:=1 to kol1 do read(ar1);
writeln('Vvedite koeffichienty delitelya: '); for i:=1 to kol1 do read(ar2[i]);
l:=kol1-kol2; repeat inc(k); if l>=k then begin inc(j); ar3[j]:=ar1[k]/ar2[l]; for i:=k to kol1 do ar1[i]:=ar1[i]-ar2[l+i-k]*ar3[j]; end; until l<k;
writeln('Koeffichienty poluchenogo mnogochlena: '); for i:=1 to k-1 do write(ar3[i],' ');
writeln; writeln('Ostatok: '); for i:=k to kol1 do write(ar1[i],' ');
end.
Цитата
P.S.: 1.[i]Конец всему делу венец
2.Лучше поздно чем никогда
Автор: volvo 17.03.2007 17:24
Цитата
Вот прекрасно работающий
Понимаешь, в чем дело... Если меня пытаются уверить в том, что что-то прекрасно и безошибочно работает, у меня... Как бы это сказать помягче... Почему-то возникают сомнения... Смотри:
Цитата
writeln('Vvedite koeffichienty delitelya: '); for i:=1 to kol1 do read(ar2[i]);
То есть ты даже не соизволил ЭТО протестировать... А если вот тут
Цитата
ar3[j]:=ar1[k]/ar2[l];
в знаменателе будет 0, это что, ТОЖЕ будет считаться "безошибочной работой", или что?
Ну, и закончить хочется вопросом: Как ты думаешь, при делении 6x2 - 8x на 2x , что должно получиться в результате, и что в остатке? А теперь проверь своей программой...