
五次方程
-
2023年3月20日发(作者:地震作用)一元高次方程c语言实现(windowsVC6.0版本)
注意:如果在linuxvine或者UNIX以及非windows的系统下运行的话将代码pow以及
sqrt全部替换为powf和sqrtf
以下为代码
#include
#include
#include
#include
#defineMAX1000/*最大递归次数为1000次*/
#defineERROR"matherrorn"/*显示错误信息*/
charFun3[10],fx5[10]="";/*美化输出结果*/
floata1,b1,c1,d1,e1,f1;/*宏定义高次方程各项系数最大五次*/
intNUMjdg;/*判断函数最高次数*/
floatFC(floata,floatb);/*解一元一次方程*/
floatFC3(floata,floatb,floatc,floatd);/*解一元三次方程*/
floatFC2(floata,floatb,floatc,intnum);/*解一元二次方程*/
floatFC4(floata,floatb,floatc,floatd,floate);/*解一元四次方程*/
floatFC5();/*解一元五次方程*/
floatfun(floatx);/*五次函数代值求解*/
floatdfun(floatx);/*五次导函数代值求解*/
floatiterate(floatx);/*牛顿迭代法猜值求解*/
intmain()
{
floatx5;/*五次方程最后一个解*/
FILE*fp;/*解的内容以文件的形式保存*/
charsave;
charbuf[256];/*从文件内读取内容保存至buf*/
buf[0]='0';/*防止乱码,开头定义为NULL*/
fp=fopen("","w");
strcpy(Fun3,"");
fclose(fp);
printf("Doyouwanttosavetheresult?'y'or'n'");/*是否想保存结果
数据?*/
printf("n--->");
scanf("%c",&save);
redo:
printf("pleaseinputdegreenumbern--->");/*请输入最高次数*/
scanf("%d",&NUMjdg);
if(NUMjdg5)gotoredo;
printf("thenumberofa?--->");/*输入最高次项系数*/
scanf("%f",&a1);
if(a1==0)
{printf(ERROR);return1;}
printf("thenumberofb?--->");/*输入第二高次项系数*/
scanf("%f",&b1);
if(NUMjdg==1)
{printf("theresultis%gn",FC(a1,b1));gotoend1;}
printf("thenumberofc?--->");/*输入第三高次项系数*/
scanf("%f",&c1);
if(NUMjdg==2)
{FC2(a1,b1,c1,1);gotoend2;}
printf("thenumberofd?--->");/*输入第四高次项系数*/
scanf("%f",&d1);
if(NUMjdg==3)
{FC3(a1,b1,c1,d1);gotoend3;}
printf("thenumberofe?--->");/*输入第五高次项系数*/
scanf("%f",&e1);
if(NUMjdg==4)
{FC4(a1,b1,c1,d1,e1);gotoend4;}
printf("thenumberoff?--->");/*输入常数项系数*/
scanf("%f",&f1);
x5=FC5();
end2:end4:
if(a1!=0)printf("n********nThereisfollowingresult:n");
fp=fopen("","r");
while(fgets(buf,256,fp)!=NULL)
{printf("%s",buf);}
fclose(fp);fp=fopen("","a");
if(NUMjdg==5){
fprintf(fp,"x%s=%gn",fx5,x5);
printf("x%s=%gn",fx5,x5);
}
fclose(fp);
end1:
end3:
if(save=='n')
{unlink("");}
getch();
b=b1+x1;c=c1+b*x1;d=d1+c*x1;e=e1+d*x1;
FC4(1.0,b,c,d,e);
printf("oneoftheresultis%gn",x1);
returnx1;
}
/*解法请参照盛金公式,费拉里公式,牛顿迭代法,一元二次求根公式*/
floatFC4(floata,floatb,floatc,floatd,floate)
{
floaty;
floatM,N,P;
floaty0[4];
inti;
b/=a;c/=a;d/=a;e/=a;a=1.0;
printf("FC4a:%gb:%gc:%gd:%ge:%gn",a,b,c,d,e);
y0[0]=8.0;
y0[1]=-4.0*c;
y0[2]=-1*(8.0*e-2.0*b*d);
y0[3]=-e*(b*b-4.0*c)-d*d;
for(i=1;i<=3;i++)
{printf("y%d:%g",i,y0[i]);}
printf("n");
y=FC3(y0[0],y0[1],y0[2],y0[3]);
printf("y:%g",y);
M=sqrt(8.0*y+b*b-4.0*c);
N=b*y-d;
printf("M:%gN:%gn",M,N);
if(M==0)
{
P=sqrt(y*y-e);
printf("P:%gn",P);
FC2(2.0,b,2.0*(y+P),1);
FC2(2.0,b,2.0*(y-P),3);
}
else
{
FC2(2.0,b+M,2.0*(y+N/M),1);
FC2(2.0,b-M,2.0*(y-N/M),3);
}
return0.0;
}
floatFC3(floata,floatb,floatc,floatd)
{
floatA,B,C,delta,x[3],ni,fun[3];
floaty1,y2,k,T,theta;
floattemp;
FILE*fp;
inti,y_1=1,y_2=1;
printf("FC3-->a=%gb=%gc=%gd=%gn",a,b,c,d);
A=b*b-3*a*c;
B=b*c-9*a*d;
C=c*c-3*b*d;
delta=B*B-4*A*C;
printf("fc3A:%gB:%gC:%gn",A,B,C);
printf("fc3delta:%gn",delta);
if(NUMjdg==3){
printf("Thereisfollowingresult:nn");
fp=fopen("","w");
}
else{
strcpy(Fun3,"fun3:");
}
if(delta==0)
{
if(A==B)
{
if(b==0)
{printf("%sx[1]=x[2]=x[3]=%dn",Fun3,0);}
else
{printf("%sx[1]=x[2]=x[3]=%gn",Fun3,-b/(3*a));}
if(b==0)
{fprintf(fp,"%sx[1]=x[2]=x[3]=%dn",Fun3,0);}
else
{fprintf(fp,"%sx[1]=x[2]=x[3]=%gn",Fun3,-b/(3*a));}
fun[0]=-b/(3*a);
fun[1]=fun[0];
fun[2]=fun[1];
if(NUMjdg==3)
{printf("n");fclose(fp);}
returnfun[0];
}
else
{
k=B/A;
printf("%sx[1]=%gn",Fun3,fun[0]=-b/a+k);
printf("%sx[2]=%gn",Fun3,fun[1]=-k/2);
fprintf(fp,"%sx[1]=%gn",Fun3,fun[0]=-b/a+k);
fprintf(fp,"%sx[2]=%gn",Fun3,fun[1]=-k/2);
if(NUMjdg==3)
{printf("n");fclose(fp);}
if(fun[0]>fun[1])
{returnfun[0];}
else
{returnfun[1];}
}
}
elseif(delta>0)
{
y1=A*b+1.5*a*(-B+pow(delta,0.5));
if(y1<0.0)
{y_1=-1;}
y2=A*b+1.5*a*(-B-pow(delta,0.5));
if(y2<0)
{y_2=-1;}
if(NUMjdg!=3)printf("y1:%gny2:%gn",y1,y2);
x[0]=(-b-y_1*pow(fabs(y1),1.0/3.0)-
y_2*pow(fabs(y2),1.0/3.0))/(3*a);
x[1]=(-
2*b+y_1*pow(fabs(y1),1.0/3.0)+y_2*pow(fabs(y2),1.0/3.0))/(6*a);
ni=pow(3.0,0.5)*(y_1*pow(fabs(y1),1.0/3.0)-
y_2*pow(fabs(y2),1.0/3.0))/(6*a);
printf("%sx[1]=%gn",Fun3,fun[0]=x[0]);
printf("%sx[2]=%g+%gin",Fun3,x[1],fabs(ni));
printf("%sx[3]=%g-%gin",Fun3,x[1],fabs(ni));
fprintf(fp,"%sx[1]=%gn",Fun3,fun[0]=x[0]);
fprintf(fp,"%sx[2]=%g+%gin",Fun3,x[1],fabs(ni));
fprintf(fp,"%sx[3]=%g-%gin",Fun3,x[1],fabs(ni));
fun[1]=fun[0];
fun[2]=fun[1];
if(NUMjdg==3)
{printf("n");fclose(fp);}
returnfun[0];
}
else
{
T=(2*A*b-3*a*B)/(2*pow(A,1.5));
theta=acos(T);
theta/=3;
if(NUMjdg!=3){
printf("T:%gn",T);
printf("theta:%gn",theta);}
//cs=theta+2/3*i*acos(-1);
x[0]=(-b-2*pow(A,0.5)*cos(theta))/(3*a);
x[1]=(-b+pow(A,0.5)*(cos(theta)+pow(3,0.5)*sin(theta)))/(3*a);
x[2]=(-b+pow(A,0.5)*(cos(theta)-pow(3,0.5)*sin(theta)))/(3*a);
for(i=0;i<3;i++){printf("%sx[%d]=%gn",Fun3,i+1,fun[i]=x[i]);}
if(NUMjdg==3)
{for(i=0;i<3;i++)
{fprintf(fp,"%sx[%d]=%gn",Fun3,i+1,fun[i]=x[i]);}}
if(fun[0]>fun[1])
{temp=fun[0];}
else
{temp=fun[1];}
if(NUMjdg==3)
{printf("n");fclose(fp);}
if(temp>fun[2])
{returntemp;}
else
{returnfun[2];}
}
}
floatFC2(floata,floatb,floatc,intnum)
{
FILE*fp;
floatd;
printf("FC2a:%gb:%gc:%gn",a,b,c);
d=b*b-4*a*c;
fp=fopen("","a");
if(d<0)
{
fprintf(fp,"x[%d]=%g+%gin",num,-b/2/a,pow(-d,0.5)/(2*a));
fprintf(fp,"x[%d]=%g-%gin",num+1,-b/2/a,pow(-d,0.5)/(2*a));
}
elseif(d==0)
{
if(b==0.0)
{fprintf(fp,"x[%d]==x[%d]==0n",num,num+1);}
else
{fprintf(fp,"x[%d]==x[%d]==%gn",num,num+1,-b/2/a);}
}
else
{
fprintf(fp,"x[%d]=%gn",num,(-b+pow(d,0.5))/(2*a));
fprintf(fp,"x[%d]=%gn",num+1,(-b-pow(d,0.5))/(2*a));
}
fclose(fp);
return0.0;
}
floatFC(floata,floatb)
{FILE*fp;fp=fopen("","a");fprintf(fp,"x=%gn",-
b/a);fclose(fp);return-b/a;}