关于二分法的小程序,大虾帮帮忙。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于二分法的小程序,大虾帮帮忙。相关的知识,希望对你有一定的参考价值。

我想让用户输入一个区间比如-10~10,然后我根据这个区间中根的个数将区间划分成count个,并分别把各个区间的左右边界保存到bot[]和top[]数组中,然后用二分法对各个区间的值求解并输出。程序如下,哪儿错了
#include "math.h"
#include "stdio.h"
float polynomial(float x)
//多项式函数,用于给定多项式形式
float y;
y=((3*x+6)*x-1)*x+2;
return y;
//polynomial函数

int find(int *bot,int *top,int bot1,int top1)
//根据多项式函数fun自动搜索求根区间,并把各个区间的上限和下限分别保存到top[]和bot[]数组中,返回包含根的区间个数
float y1,y2;
int x1,x2;
int count=0;
x1=bot1;
x2=bot1+1;
while(x2<=top1)

y1=polynomial((float)x1);
y2=polynomial((float)x2);
while(y1*y2>0&&x2<=top1)

x2++;
y2=polynomial((float)x2);

bot[count]=x1;
top[count]=x2;
count++;
x1=x2;
x2=x1+1;

return count;

//find函数

float bin_root(int bot,int top)
//函数功能,二分法求根
float y,y1,y2;
float x1=bot,x2=top,x;
x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);
while(fabs(y)>=1e-6)

if(y*y1>0)

x2=x;

else

x1=x;

x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);

return x;
//二分法求根bin_root函数

void main()

int count,bot[10],top[10];
int bot1,top1;//由用户输入求根区间,程序自动找到该区间中存在的根的个数
int i;
float root;
printf("请输入求根区间:\n");
scanf("%d%d",&bot1,&top1);
count=find(bot,top,bot1,top1);
if(count==0)printf("函数在您输入的区间内无根:\n");
for(i=0;i<count;i++)

root=bin_root(bot[i],top[i]);
printf("函数在子区间[%d,%d]内的根为:%.4f\n",bot[i],top[i],root);

两个错误。
1、你把精确度设为1e-6。注意,float的有效数字只有6位,所以算到小数点后6位时,x1,x2,x的值很有可能就一样了,那么x,x1,x2的值将不将变化,而且肯定会大于1e-6,导致死循环。
解决方法是把所有数据改成double型。
2、仔细分析一下你的find函数吧,它求得的最后一个根区间有很大可能并不包含一个有效根。
比如我输入-10 10,那么,第一个根区间会是-10,-2,那么第2个区间就成了-2,11,第2个区间并不包含根。
解决方法是在调用bin_root前,判断一下polynomial(bot[i])*polynomial(top[i])<0

另外,你的find函数在生成最后一个根区间时,会出现x2比top1大1的情况。你自己改改吧。

我的代码如下:
#include "math.h"
#include "stdio.h"
double polynomial(double x)
//多项式函数,用于给定多项式形式
double y;
y=((3*x+6)*x-1)*x+2;
return y;
//polynomial函数

int find(int *bot,int *top,int bot1,int top1)
//根据多项式函数fun自动搜索求根区间,并把各个区间的上限和下限分别保存到top[]和bot[]数组中,返回包含根的区间个数
double y1,y2;
int x1,x2;
int count=0;
x1=bot1;
x2=bot1+1;
while(x2<=top1)

y1=polynomial((double)x1);
y2=polynomial((double)x2);
while(y1*y2>0&&x2<=top1)

x2++;
y2=polynomial((double)x2);

bot[count]=x1;
top[count]=x2;
count++;
x1=x2;
x2=x1+1;

return count;

//find函数

double bin_root(int bot,int top)
//函数功能,二分法求根
double y,y1,y2;
double x1=bot,x2=top,x;
x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);
while(fabs(y)>=1e-6)

if(y*y1<0)

x2=x;

else

x1=x;

x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);

return x;
//二分法求根bin_root函数

void main()

int count,bot[10],top[10];
int bot1,top1;//由用户输入求根区间,程序自动找到该区间中存在的根的个数
int i;
double root;
printf("请输入求根区间:\n");
scanf("%d%d",&bot1,&top1);
count=find(bot,top,bot1,top1);
if(count==0)printf("函数在您输入的区间内无根:\n");
for(i=0;i<count;i++)

if(polynomial(bot[i])*polynomial(top[i])<0)

root=bin_root(bot[i],top[i]);
printf("函数在子区间[%d,%d]内的根为:%.4f\n",bot[i],top[i],root);


参考技术A 没时间帮你看,发一个二分算法给你参考一下:
/********************************************************************
* @作者 :
* @功能 :二分算法
*
* @输入 :head_data:待查内存首个序号,
* array_len :待查区域长度
* data_len:待查区域中一个单元数据大小,
* match_data:需要查询的匹配数据
*
*@输出 :(void*) 输出找到数据的位置,如果为0则表示
* 没有匹配到数据
********************************************************************/
void* my_dichotomy_algorithm( Bsize_t *head_data, Bsize_t array_len,
Bsize_t data_len, Bsize_t match_data )

Bsize_t *cur_pos ;
Bsize_t sum_len = array_len;
while ( 1 )

cur_pos = ( Bsize_t* )(( Bsize_t* )head_data + ( array_len / 2 ) * data_len ) ;
if ( *cur_pos == match_data )

return ( void* )cur_pos;

if (( !array_len ) || !( array_len / 2 ) )

break;

if (( *cur_pos < match_data ) )

head_data = cur_pos;
array_len = sum_len - array_len / 2;
sum_len = array_len;

else

array_len = array_len / 2;
sum_len = array_len;


return 0;
参考技术B 有难度,建议找专业网站~~顶下~顺便,收分呵呵

jquery easyui datagrid 的分页,为啥总是显示所有的数据啊,哪位大虾帮忙看看啊,下面是代码

$('#test').datagrid(
title: 'My DataGrid',
iconCls: 'icon-save',
width: 700,
height: 350,
nowrap: false,
url: "Ajax_Access",
striped: true,
collapsible: false,
singleSelect: true,
pagination: true, //分页控件
loadMsg: '正在加载数据...',
sortName: 'id',
sortOrder: 'desc',
remoteSort: false,
idField: 'id',
frozenColumns: [[

你前台的参数没写错,是不是传到后台时没有处理,不是只加载当前页的数据,而是全部加载了所有数据,这样就会显示所有数据 参考技术A 返回的json数据里有total这个属性,才可以支持分页,例如:"total":50,"data":[] 参考技术B 页面中需要添加属性:
pageSize: 20,
pageList: [10, 20, 30, 40, 50],

后台需要返回total:的值

以上是关于关于二分法的小程序,大虾帮帮忙。的主要内容,如果未能解决你的问题,请参考以下文章

cobol中comp数据类型的小问题,请大虾帮忙

vb编的小程序,关闭窗口时 弹出的窗口提示 如何改变

求帮忙写几个PHP的小程序,要交的,谢谢啦

C/C++/C#请人帮忙测试读串口的小程序,C#/wpf做的windows桌面小程序

C++ assert(0); 语句直接忽略了,没有执行,可能是啥原因啊?各位大虾,帮帮忙

关于列表应用的小程序