Написал код вычисления коэф. ньютона-котэса но при i>8 начинает долго тормозить помогите с оптимизацией Код (Text): #include <stdio.h> #include <conio.h> #include <math.h> #define MAX 100 struct drob {long long c;long long z;}; drob H; void head() { // clrscr(); printf("Vychislenie koefficintov newtona kotesa\n\n"); return; } long long fact(long long n) { long long res; res=1; while(n>1)res*=n--; return res; } void printd(drob d) { printf("%d/",d.c); // printf("---\n"); printf("%d\n",d.z); } drob koef(int i,int n) { drob k; k.c=1; if((i-n)%2)k.c=-1; k.z=(n*fact(i)*fact(n-i)); return k; } drob sokr(drob v) { long long i; i=(v.c<v.z?v.c:v.z); // printf("min=%d",i); while(i>1) { if ((v.c%i==0)&&(v.z%i==0)) { v.c/=i; v.z/=i; } i--; } return v; } long long mypow(int x,int y) { long long res; int i; res=1; for(i=1;i<=y;i++)res*=x; return res; } drob integral(int i,int n) { drob c[MAX],d[MAX]; int k,j;long long nod;drob in;int q; q=n; // c[0]=d[0]=0; for (j=0;j<MAX;j++) {c[j].c=0;c[j].z=1;d[j].c=0;d[j].z=1;} //ishem koefficienty d[1].c=1; for (j=1;j<=n;j++) { d[j+1].c=d[j].c*j*(-1); if (j>1) for (k=j;k>=2;k--) d[k].c=d[k].c+d[k-1].c*j*(-1); } c[1].c=d[1].c; //delim na q-i for (j=1;j<=n+1;j++) { c[j].c=i*c[j-1].c+d[j].c; } /* for (j=1;j<=n+1;j++) { if(c[j].c>=0&&j>1) printf("+"); printf("%dq",c[j].c); printf("^%d",n-j+2); } printf("\n"); for (j=1;j<=n+1;j++) { printf("---- "); } printf("\n"); for (j=1;j<=n+1;j++) { printf("%4d ",n-j+2); }*/ ////////////////////////////////////////// //vych nod nod=1; for (j=1;j<=n+1;j++) nod*=j; /* printf("\n"); for (j=1;j<=n+1;j++) { if(c[j].c>=0&&j>1) printf("+"); printf("%dq",c[j].c*nod/(n-j+2)); printf("^%d",n-j+2); } printf("\n"); for (j=1;j<=n+1;j++) { printf("---- "); } printf("\n"); for (j=1;j<=n+1;j++) { printf("%4d ",nod); } printf("\n");*/ in.c=0; in.z=nod;long long dd; //vych integral for (j=1;j<=n+1;j++) { //in.c=in.c+((c[j].c)*nod/(n-j+2))*exp((n-j+2)*log(q));printf("[%d]",in.c);} // in.c=exp((n-j+2)*log(q))+1; // dd=exp((n-j+2)*log(q));//(q+1)%2; dd=mypow(q,n-j+2); // printf("[%d]",dd); dd*=((c[j].c)*nod/(n-j+2)); in.c+=dd; // dd=(c[j].c)*nod/(n-j+2); // printf("<%d>",dd); // printf("<%d>",in.c); } // in.z=nod; // printf("nod=%d\n",nod); // printd(in); in=sokr(in); return in; } drob Hk(int i,int n) { drob res; drob k, in; k=koef(i,n); in=integral(i,n); res.c=k.c*in.c; res.z=k.z*in.z; res=sokr(res); return res; } void debug() { drob in; int i,j; for(i=1;i<20;i++) for(j=0;j<=i;j++) { in=Hk(j,i); printf("H(i=%d,n=%d)=",j,i); printd(in); }/* in=Hk(1,6); printd(in);/* in=koef(0,1); printd(in);*/ } int main() { head(); debug(); getch(); return 0; }
y(x) Процедуры вычисления коэффициентов в Newton-Cotes есть в библиотеке DIVDIF, в том числе и на С++. Посмотри, будут ли они тормозить, если нет, то можешь сравнить их код со своим. Кстати сказать, порядки выше 4-5 практического значения не имеют.
Stiver спасибо, но я хочу свой код [PaCHER], извини но очень торопился All, всем спасибо я разобрался. торможения были в функции сокращения дробей