C语言程序:二分法解方程 5
要编一个用户可输入系数的五次方程,只存在1个根的区间[m,n]以及根的精度p,然后求出方程在这个区间的解和执行步骤数。我编了下面程序,输入值是0,0,1,0,-1,-1即...
要编一个用户可输入系数的五次方程,只存在1个根的区间[m,n]以及根的精度p,然后求出方程在这个区间的解和执行步骤数。我编了下面程序,输入值是0,0,1,0,-1,-1 即方程为x^3-x-1=0 1,1.5,0.001 即区间为(1,1.5),精度为0.001 但是输出结果总是-858993460。请问这是为什么,如何改程序?
#include<stdio.h>
#include<math.h>
#define f(x) (a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f) //定义五次方程
int main()
{
double m,n,j,h,p,t; //m,n为区间。j为方程解,h为区间中间值,p为精度,t为区间长度
int k,a,b,c,d,e,f; //k为执行步骤数,剩下为方程系数
printf("To a formula:ax^5+bx^4+cx^3+dx^2+ex+f=0:\n");
printf("Please input:a,b,c,d,e,f:");
scanf("%d,%d,%d,%d,%d,%d",&a,&b,&c,&d,&e,&f);//用户输入方程系数
printf("Please input the district (m,n) and precision p,for example(1,2,0.0001):");
scanf("%d,%d,%d",&m,&n,&p);//用户输入区间和精度
if(f(m)*f(n)>0)//判断区间是否有一个根
printf("There is no sole root in this district\n");
else
for(k=0;;k++)
{
h=(m+n)/2;//计算区间中间值
t=n-m;//区间长度
if(f(m)*f(n)==0)//判断端点值是否为根
if(f(m)==0)
j=m;
else
j=n;
break;//若端点值为根,跳出循环结构,输出结果
if(fabs(t)>p)//判断区间长度绝对值是否大于精度
if(f(m)*f(h)>0)
m=h;
else
n=h;
else
j=h;
}
printf("The root is %d and steps are %d\n",j,k);//输出方程的根和步骤数
return 0;
} 展开
#include<stdio.h>
#include<math.h>
#define f(x) (a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f) //定义五次方程
int main()
{
double m,n,j,h,p,t; //m,n为区间。j为方程解,h为区间中间值,p为精度,t为区间长度
int k,a,b,c,d,e,f; //k为执行步骤数,剩下为方程系数
printf("To a formula:ax^5+bx^4+cx^3+dx^2+ex+f=0:\n");
printf("Please input:a,b,c,d,e,f:");
scanf("%d,%d,%d,%d,%d,%d",&a,&b,&c,&d,&e,&f);//用户输入方程系数
printf("Please input the district (m,n) and precision p,for example(1,2,0.0001):");
scanf("%d,%d,%d",&m,&n,&p);//用户输入区间和精度
if(f(m)*f(n)>0)//判断区间是否有一个根
printf("There is no sole root in this district\n");
else
for(k=0;;k++)
{
h=(m+n)/2;//计算区间中间值
t=n-m;//区间长度
if(f(m)*f(n)==0)//判断端点值是否为根
if(f(m)==0)
j=m;
else
j=n;
break;//若端点值为根,跳出循环结构,输出结果
if(fabs(t)>p)//判断区间长度绝对值是否大于精度
if(f(m)*f(h)>0)
m=h;
else
n=h;
else
j=h;
}
printf("The root is %d and steps are %d\n",j,k);//输出方程的根和步骤数
return 0;
} 展开
2个回答
展开全部
1. scanf("%d,%d,%d",&m,&n,&p);要改成scanf("%f,%f,%f",&m,&n,&p)
2.
if(f(m)*f(n)==0
if(f(m)==0)
j=m;
else
j=n;
break;
要改成
if(f(m)*f(n)==0
{ if(f(m)==0)
j=m;
else
j=n;
break; }
3:
else
j=h;
要改成
else
{ j=h; break; }
4:
printf("The root is %d and steps are %d\n",j,k)
要改成
printf("The root is %f and steps are %d\n",j,k)
另外,结果虽然正确了,但是逻辑还是比较混乱的。
2.
if(f(m)*f(n)==0
if(f(m)==0)
j=m;
else
j=n;
break;
要改成
if(f(m)*f(n)==0
{ if(f(m)==0)
j=m;
else
j=n;
break; }
3:
else
j=h;
要改成
else
{ j=h; break; }
4:
printf("The root is %d and steps are %d\n",j,k)
要改成
printf("The root is %f and steps are %d\n",j,k)
另外,结果虽然正确了,但是逻辑还是比较混乱的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询