программа не поступает как нужно
#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 но он не получается ((