用c语言求一个四元二次方程解的个数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言求一个四元二次方程解的个数相关的知识,希望对你有一定的参考价值。

-100<x<100且x!=0... a,b,c,d范围是[-50,50] 要求输入abcd的值,输出方程解的个数
输入1 ,2 ,3 ,-4的时候,结果应该是39088 输入1 1 1 1 时结果是0.

提取公因式后 本题其实是一个一元三次方程
根据 三次方程新解法——盛金公式解题法 见http://baike.baidu.com/view/1382952.htm#4
编程如下

#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
#include <cmath>
#include <math.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define JINGDU double
#define MYSQRT(x) (JINGDU)sqrt((x))
#define ZERO 10e-6
#define MYSIN(x) (JINGDU)sin((x))
#define MYCOS(x) (JINGDU)cos((x))
#define ARCSIN(x) (JINGDU)asin((x))
#define ARCCOS(x) (JINGDU)acos((x))

JINGDU sqr3(JINGDU x)

if(x<0) x=-x;return -(JINGDU)pow(x,1.0/3);
else return (JINGDU)pow(x,1.0/3);

void x3fun(JINGDU a,JINGDU b,JINGDU c,JINGDU d)

JINGDU A=b*b-3*a*c,B=b*c-9*a*d,C=c*c-3*b*d,delta=B*B-4*A*C; //A=b^2-3ac;B=bc-9ad;C=c^2-3bd 总判别式:Δ=B^2-4AC。
JINGDU X1,X2,X3;
if(!A&&!B)//当A=B=0时,方程有一个三重实根

if(a)X1=X2=X3=-b/(3*a);
if(b)X1=X2=X3=-c/b;
if(c)X1=X2=X3=-d/c; //X1=X2=X3=-b/(3a)=-c/b=-3d/c
printf("%8f%8f%8f\n",X1,X2,X3);

JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);

return;


if(delta<ZERO&&delta>-ZERO)//当Δ=B^2-4AC=0时,方程有三个实根,其中有一个两重根;

JINGDU K=B/A;
X1=-b/a+K;
X2=X3=-K/2; //X1=-b/a+K;X2=X3=-K/2
printf("%8f%8f%8f\n",X1,X2,X3);

JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);

return;


if(delta>ZERO)//当Δ=B^2-4AC>0时,方程有一个实根和一对共轭虚根

JINGDU Y1=A*b+3*a*(-B+MYSQRT(B*B-4*A*C))/2;
JINGDU Y2=A*b+3*a*(-B-MYSQRT(B*B-4*A*C))/2;//Y1,Y2=Ab+3a(-B±(B^2-4AC)^(1/2))/2
X1=(-b-sqr3(Y1)-sqr3(Y2))/(3*a); //X1=(-b-(Y1)^(1/3)-(Y2)^(1/3))/(3a);
JINGDU real=(-2*b+sqr3(Y1)+sqr3(Y2))/(6*a);//X2,X3=(-2b+(Y1)^(1/3)+(Y2)^(1/3))/(6a)
JINGDU complex=MYSQRT(3)*(sqr3(Y1)-sqr3(Y2))/(6*a);//±3^(1/2)((Y1)^(1/3)-(Y2)^(1/3))i/(6a)
printf("%5f\t",X1);
printf("%f+%fi\t",real,complex);
printf("%f-%fi\t\n",real,complex);

JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);

return;


if(delta<ZERO)//当Δ=B^2-4AC<0时,方程有三个不相等的实根

JINGDU T=(2*A*b-3*a*B)/(JINGDU)pow(2*A,3/2);//T= (2Ab-3aB)/(2A^(3/2))
JINGDU xita=ARCCOS(T); //θ=arccosT
X1=(-b-MYSQRT(2*A)*MYCOS(xita/3))/(3*a);//X1=(-b-2A^(1/2)cos(θ/3))/(3a);
X2=(-b+MYSQRT(A)*(MYCOS(xita/3)+MYSQRT(3)*MYSIN(xita/3)))/(3*a);
X3=(-b+MYSQRT(A)*(MYCOS(xita/3)-MYSQRT(3)*MYSIN(xita/3)))/(3*a);
printf("%8f%8f%8f\n",X1,X2,X3);
JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);

return;

JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);



int main(int argc, char* argv[])

//myfilesum();
JINGDU a,b,c,d;
cin>>a>>b>>c>>d;
x3fun(a,b,c,d);
return 0;
追问

不是吧,我只想求出根的个数就行了,不需要具体求出来

追答

你题目给的不严谨,我补充一下你的题目,你看看是不是这个意思:
-100<x1,x2,x3,x4<100且x1,x2,x3,x4!=0... a,b,c,d范围是[-50,50] ,且a,b,c,d,x1,x2,x3,x4 都是整数,要求输入abcd的值,输出方程解的个数。如
输入1 ,2 ,3 ,-4的时候,结果应该是39088 输入1 1 1 1 时结果是0.

追问

追答

可以看成2个二元二次的方程如:
○1 这个两个式子都成立,那么原方程成立,所以取这两个根的个数的最小值。
同理也可看成
○2
○3
○1○2○3 三种情况的和就是原方程的根的个数。
举例○1求二元二次的根的个数:
○1的第一个方程化为: 所以b与a必须异号;
用循环即可求出个数
代码下面给出

追问

我试了一下,没成功

参考技术A 对电脑来说这是它再擅长不过的事了~!

#include <stdio.h>
#include <stdlib.h>
void main( )

int a,b,c,d;
int x1,x2,x3,x4,count=0;
printf("请输入a,b,c,d的值,用空格隔开:\n");
scanf("%d %d %d %d",&a,&b,&c,&d);
for(x1=1;x1<=100;x1++)
for(x2=1;x2<=100;x2++)
for(x3=1;x3<=100;x3++)
for(x4=1;x4<=100;x4++)

if(a*x1*x1+b*x2*x2+c*x3*x3+d*x4*x4==0)
count++;

printf("解的个数为:%d\n",count*16);
//因为x可正,可负,每个解有16种组合
system("pause");

追问

四个循环太多了,能不能简化一下??

追答

对这道题来说,就算是时间复杂度为N^4,但是N很小,完全没影响,几乎是瞬间求解的,这正是利用计算机的特性,没必要在算法上过多纠结,这应该是对计算机来说最好的算法了
你可以试下~!

追问

不是,我以前也是这样编的,但是过不了啊。我问过了,都说是超时。再帮我优化一下好不好?我都弄了几天了

追答

超时? 什么意思,还要限制求解时间? 我测试的时候都是一瞬间就求出来了的
你得说清楚这道题是用来干什么的,如果是一道编程题,这样就可以了,如果是一道数学题,算法才需要优化的

参考技术B 学不是学数学的没学过,但是可以用一些非常规方法得出来,而且也不敢说是唯一的解,只能说这个解是一个正确的解。

只是单纯的从对数字的感觉入手,从cd=-9入手,尽量去整数,且绝对值尽量小,然后假设c=3,d=-3。或者从a开始,取0,因为前3个算式可以简化。降次减元可以简化计算,但是毕竟是人为的假设,所以还是不能作为绝对的4元2次方程组的理论应用,只是凑数还可以
参考技术C 输出方程解的个数?是求x1x2x3x4吗???追问

不是,不需要具体解,只把解的个数算出来就行了

c++求解一元二次方程

#include<iostream.h>
#include<math.h>
void main()

double a,b,c,d,e,x1,x2;
cout<<"请输入要求解的一元二次方程:"<<endl;
cout<<"a: ";
cin>>a;
cout<<"b: ";
cin>>b;
cout<<"c: ";
cin>>c;
cout<<a<<"*x*x"<<"+"<<b<<"*x"<<"+"<<c<<"=0"<<endl;
d=b*b-4*a*c;
if(d<0)

cout<<"There is no x."<<endl;

if(d==0)

cout<<"There is only x."<<endl;
x1=x2=(-b)/(2*a);
cout<<"x1=x2="<<x1<<endl;

if(d>0)

e=sqrt(d);
x1=(-b+e)/(2*a);
x2=(-b-e)/(2*a);
cout<<"x1="<<x1<<endl;
cout<<"x2="<<x2<<endl;

扩展资料:

一元二次方程成立必须同时满足三个条件:

1、是整式方程,即等号两边都是整式,方程中如果有分母;且未知数在分母上,那么这个方程就是分式方程,不是一元二次方程,方程中如果有根号,且未知数在根号内,那么这个方程也不是一元二次方程(是无理方程)。

2、只含有一个未知数;

3、未知数项的最高次数是2 。

参考技术A 已调试,无错误。希望对你有所帮助!
#include<iostream.h>
#include<math.h>

void main()

double a,b,c,d,e,x1,x2;
cout<<"请输入要求解的一元二次方程:"<<endl;
cout<<"a: ";
cin>>a;
cout<<"b: ";
cin>>b;
cout<<"c: ";
cin>>c;
cout<<a<<"*x*x"<<"+"<<b<<"*x"<<"+"<<c<<"=0"<<endl;
d=b*b-4*a*c;

if(d<0)

cout<<"There is no x."<<endl;

if(d==0)

cout<<"There is only x."<<endl;
x1=x2=(-b)/(2*a);
cout<<"x1=x2="<<x1<<endl;

if(d>0)

e=sqrt(d);
x1=(-b+e)/(2*a);
x2=(-b-e)/(2*a);
cout<<"x1="<<x1<<endl;
cout<<"x2="<<x2<<endl;



复杂点的

#include<iostream>
#include<math.h>
using namespace std;
class funtion

public:
~funtion()cout<<"求解完毕"<<endl;
void set_value(); //输入函数
void display(); //求解函数
void show_value();//输出函数
private:
float a;
float b;
float c;
float x1;
float x2;
float r;
float i;
float pd;
;
void funtion::set_value ()

cout<<"输入 a b c 的值且 a b c 不可全为零"<<endl;
cin>>a;
cin>>b;
cin>>c;

void funtion::display ()

pd=b*b-4*a*c;
if(pd>0)

x1=-b/(2*a)+sqrt(pd)/(2*a);
x2=-b/(2*a)-sqrt(pd)/(2*a);

else if(pd==0)

x1=-b/(2*a);
x2=-b/(2*a);

else

r=-b/(2*a);
i=sqrt(-pd)/(2*a);


void funtion::show_value ()


if(pd>0)
cout<<"x1="<<x1<<" "<<"x2="<<x2<<endl;
else if(pd==0)
cout<<"x1="<<x1<<" "<<"x2="<<x2<<endl;
else
cout<<"x1="<<r<<'+'<<i<<"i"<<" "<<"x2="<<r<<'+'<<i<<"i"<<endl;

int main()

funtion f;
f.set_value ();
f.display ();
f.show_value ();
return 0;


#include<iostream.h>
#include<math.h>
#include<iomanip.h>
void main()

float a,b,c;
double x1,x2;
cout<<"请输入a,b,c:"<<endl;
cin>>a>>b>>c;
if(a!=0)

if((b*b-4*a*c)>=0)

x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
cout<<"x1="<<x1<<setw(5)<<"x2="<<x2<<endl;

else
cout<<"无解"<<endl;


else

if(b==0)//2个=是判断相等,一个是赋值。

if(c==0)//这里也是一样的。
cout<<"x为任意解"<<endl;
else
cout<<"无解"<<endl;

else
x1=-c/b;
x2=-c/b;
cout<<"x1="<<x1<<setw(5)<<"x2="<<x2<<endl;



本回答被提问者和网友采纳
参考技术B //解一元二次方程的C++程序
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
void sqrt1(double,double);
void sqrt2(double,double);
void printer(double,double);

void main()

float a,b,c;
double x1,x2;
cout<<"请输入a,b,c:"<<endl;
cin>>a>>b>>c;
if(b*b-4*a*c !=0)

if(b*b-4*a*c)

sqrt1(x1,x2);

else

printer(x1,x2);



else

sqrt2(x1,x2);




void sqrt1(double x1,double x2) //b*b-4ac>0

float a,b,c;
if(a!=0)

x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
cout<<"x1="<<x1<<setw(5)<<"x2="<<x2<<endl;


else

if(b==0)

if(c==0)
cout<<"x为任意解"<<endl;
else
cout<<"无解"<<endl;

else

x1=x2=-c/b;
cout<<"x1="<<"x2="<<x1<<endl;





void sqrt2(double x1,double x2) //b*b-4ac=0


float a,b,c;
x1=x2=-b/(2*a);
cout<<"x1="<<"x2="<<x1<<endl;


void printer (double x1,double x2) //b*b-4ac<0

float a,b,c;
char i='i';//i后面为虚部
x1=(-b/(2*a))+(i*(sqrt(b*b-4*a*c)/(2*a)));
x2=(-b/(2*a))-(i*(sqrt(b*b-4*a*c)/(2*a)));
cout<<"x1="<<x1<<"\t"<<"x2="<<x2<<endl;

以上是关于用c语言求一个四元二次方程解的个数的主要内容,如果未能解决你的问题,请参考以下文章

用c语言编程求线性方程组的解

紧急求助:matlab求解唯一解的齐次线性方程组

用switch语句编写求一元二次方程的解的方程

非齐次线性方程组有唯一解怎么求

方程x1+x2+x3+x4=5的非负整数解的个数怎么求?

方程解的个数数论