Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

программа не поступает как нужно

47K
06 июня 2009 года
realdip
4 / / 05.06.2009
программа Нахождение НОД полиномов

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <mem.h>


//---”г*ЄжЁп **宦¤Ґ*Ёп ¬*ЄбЁ¬*«м*®Ј® Є®нддЁжЁҐ*в*---------------------------


int maxStep(double *A, int S) // Ќ*室Ёв ¬*Єб. Ё*¤ҐЄб *Ґ*г«Ґў®Ј® Є®ндЁжЁҐ*в*
{
int i;
for (i=S-1; A==0 && i>=0; i--);
return i;
}



//---”г*ЄжЁп ¤Ґ«Ґ*Ёп---------------------------------------------------------



void delenie(double *P1, double *P2, int N, int M)
{
float* PH; // Њ*ббЁў Є®в®ал© ¬л ўлзЁв*Ґ¬ Ї® 室㠤Ґ«Ґ*Ёп
float koef; //Љ®нд. ЏаЁ е ** Є®в®ал© ¤®¬*®¦*Ґ¬ ¤Ґ«ЁвҐ«м
int stepen; //‘⥯Ґ*м е ** Є®в®аго ¬л ¤®¬*®¦*Ґ¬ ¤Ґ«ЁвҐ«м
int i;
PH=(float *)malloc(sizeof(double)*N);

while (maxStep(P1,N)>=maxStep(P2,M)) // (M-1) - Њ*ЄбЁ¬*«м**п б⥯Ґ*м P2
{
stepen=maxStep(P1,N)-maxStep(P2,M);
koef=P1[maxStep(P1,N)]/P2[maxStep(P2,M)];

for (i=N-1; i>=0; i--) // zapolnenie massiva 0mi 4to bi ne
{ // dopolnyat' ego nulyami sprava i sleva
PH=0; // posle sleduyushego cikla... tak budet
} // menshe koda.


for (i=maxStep(P1,N); i>=stepen; i--) // Vi4eslenie vi4etaemogo
{ // mnogo4lena
PH=koef*P2[i-stepen];
}

for (i=maxStep(P1,N); i>=0; i--) // vi4eslenie novoi raznosti
{
P1=P1-PH;
}
}
}

//Ђ«мвҐа**вЁў**п ”г*ЄжЁп ¤Ґ«Ґ*Ёп
/*double* delenie (double* aa, double* bb, int nn, int mm)
{
int i,j;
double * k;
k=(double*)calloc(nn-mm+1,sizeof(double));

for (j=0;j<=(nn-mm);j++)
{
k[j]=aa[nn-j]/bb[mm];

for(i=0;i<=nn;i++)
{
if(i>=(nn-(mm+j)))
aa=(aa-(bb[i+j-(nn-mm)]*k[j]));
}
} return aa, bb;
}*/

//---”г*ЄжЁп ўлў®¤*---------------------------------------------------------

void vivod(double *a, int n)
{
int i,s4et4ik=0;

for (i=n-1; i>=0; i--)
{
if (a!=0)
{
if (i!=(n-1) && a>0 && s4et4ik==1) printf("+");

if (i==0) printf("%g",a);
else if (i==1) printf("%gx",a);
else printf("%g(x^%d)",a,i);
s4et4ik=1;

}
}
// printf("\n");
}


//---Ђ«мвҐа**вЁў**п д-п ўлў®¤*----------------------------------------------

void vyvDEL(double *b, int m) {
int i ;
printf("\n Delitel=");

for(i=m;i>0;i--) {

printf(" (%4.2lf)*x^(%d)+",b,i);
}
printf("(%4.2lf)",b[0]);
printf("\n"); }


//---ѓ«*ў**п дг*ЄжЁп-----------------------------------------------------


main()
{textbackground(WHITE);
textcolor(BLACK);
clrscr();
int v,m,n,i,j, T;

C1:
printf("\n ‚ўҐ¤ЁвҐ б⥯Ґ*м Ї®«Ё*®¬* A(n): ");
scanf("%d",&n);
printf(" ‚ўҐ¤ЁвҐ бвЇҐ*м Ї®«Ё*®¬* B(m): ");
scanf("%d",&m);



/* if(m>n)
{
printf("\aERROR!!!:‘⥯Ґ*м ¤Ґ«Ё¬®Ј® *Ґ ¬Ґ*миҐ б⥯Ґ*Ё ¤Ґ«ЁвҐ«п");
goto C1;
} */


///////////proverka na = 0 /////////


if((m==0)||(n==0))
{
printf("\aERROR!!!:‘⥯Ґ*Ё n Ё m *Ґ а*ў*л *г«о");
goto C1;
}

double *a,*b,*k;

a=(double*)calloc(n+1,sizeof(double));
C2:
for(i=n;i>=0;i--)
{
printf("\n‚ўҐ¤ЁвҐ Є®ндЁжЁҐ*в Ї®«Ё*®¬* A ЇаЁ x^(%d):",i);
scanf("%lf",&a);


if((i==n)&&(fabs(a)<=0.0001))
{
printf("\aERROR!!!:Љ®нддЁжЁҐ*в ЇаЁ n-o© б⥯Ґ*Ё *Ґ а*ўҐ* *г«о");
goto C2;
}
else;
}

b=(double*)calloc(n+1,sizeof(double));
C3:
for(i=m;i>=0;i--)
{
printf("\n‚ўҐ¤ЁвҐ Є®ндЁжЁҐ*в Ї®«Ё*®¬* B ЇаЁ x^(%d):",i);
scanf("%lf",&b);

if((i==m)&&(fabs(b[m])<=0.0001))
{
printf("\aERROR!!!:Љ®нддЁжЁҐ*в ЇаЁ m-o© б⥯Ґ*Ё *Ґ а*ўҐ* *г«о");
goto C3;
}
}



printf("\n Polinom A=");

for(i=n;i>0;i--) {

printf(" (%4.2lf)*x^(%d)+",a,i);
}
printf("(%4.2lf)",a[0]);

printf("\n Polinom B=");

for(i=m;i>0;i--) {

printf(" (%4.2lf)*x^(%d)+",b,i);
}
printf("(%4.2lf)",b[0]);
printf("\n");

////////////////////////////////////////


if (m>n) i=1;
else i=0;
for(;;i++)
{
if (i%2==0)
{
delenie(a,b,n+1,m+1);
if (maxStep(a,n+1)==-1) break;
}
if (i%2==1)
{
delenie(b,a,m+1,n+1);
if (maxStep(b,m+1)==-1) break;
}
}

switch (i%2)
{
case 0:
printf("\nNOD");
if (maxStep(b,m+1)==0) printf(" ne sushestvuet");
else
{
printf("=");
vivod(b,m+1);
}
break;
case 1:
printf("\nNOD");
if (maxStep(a,n+1)==0) printf(" ne sushestvuet");
else
{
printf("=");
vivod(a,n+1);
}

break;
}


getch();



}


примечание: Иероглифы в комментариях адекватно отображаются в Турбо Си или Борланд Си (консольные).


суть проблемы состоит в том что программа считает правильно НОД только если степень первого полинома четная.
вот:

if (m>n) i=1; //если степень второго больше первого присваеваем и=1
else i=0; //если степень второго больше, то и=0 (это работает)
for(;;i++)
{
if (i%2==0) //то есть и=0, 2, ... (по алгоритму мы после каждого ///деления меняем а и б
{
delenie(a,b,n+1,m+1);
if (maxStep(a,n+1)==-1) break;
}
if (i%2==1)
{
delenie(b,a,m+1,n+1);
if (maxStep(b,m+1)==-1) break;


пример для проверки

(1)x^4+(1)x^3-(3)x^2-(4)x-(1) и
(1)x^3+(1)x^2-x-1

НОД= х+1

она считает правильно только если первыя степень четная а вторая нет.. кто нибудь видит ошибку?
контр пример:

x^5+x^4-x^3-(2)*x-1
(3)x^4+2x^3+x^2+2x-2
НОД=x^2+1 но он не получается ((
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог