C++ 二分法求解方程的解
二分法是一种求解方程近似根的方法。对于一个函数 f(x)f(x),使用二分法求 f(x)f(x) 近似解的时候,我们先设定一个迭代区间(在这个题目上,我们之后给出了的两个初值决定的区间 [-20,20][−20,20]),区间两端自变量 xx 的值对应的 f(x)f(x) 值是异号的,之后我们会计算出两端 xx 的中点位置 x'x′ 所对应的 f(x')f(x′) ,然后更新我们的迭代区间,确保对应的迭代区间的两端 xx 的值对应的 f(x)f(x) 值还会是异号的。
重复这个过程直到我们某一次中点值 x'x′ 对应的 f(x') < \epsilonf(x′)<ϵ (题目中可以直接用EPSILON)就可以将这个 x'x′ 作为近似解返回给 main 函数了。
例如:

上面所示的一个迭代过程的第一次的迭代区间是 [a_1, b_1][a1,b1],取中点 b_2b2,然后第二次的迭代区间是 [a_1, b_2][a1,b2],再取中点 a_2a2,然后第三次的迭代区间是 [a_2, b_2][a2,b2],然后取 a_3a3,然后第四次的迭代区间是 [a_3, b_2][a3,b2],再取红色中点 cc,我们得到发现 f(c)f(c) 的值已经小于 \epsilonϵ,输出 cc 作为近似解。
在这里,我们将用它实现对形如 px + q = 0px+q=0 的一元一次方程的求解。
在这里,你完成的程序将被输入两个正整数 pp 和 qq(你可以认为测评机给出的 0 < |p| \leq 10000<∣p∣≤1000且 0 < |q| \leq 10000<∣q∣≤1000),程序需要用二分法求出 px + q = 0px+q=0 的近似解。
输入格式
测评机会反复运行你的程序。每次程序运行时,输入为一行,包括一组被空格分隔开的符合描述的正整数 pp 和 qq。你可以认为输入数据构成的方程 px + q = 0px+q=0 都是有解且解在 [-20, 20][−20,20] 的区间内。
输出格式
输出为一行,包括一个数字。为方程 px + q = 0px+q=0 的近似解。请使用四舍五入的方式保留小数点后 44 位小数。
#include <cstdio>
#include <cmath>
#include<iostream>
#define EPSILON 1e-7
using namespace std; double bisection(int p, int q, double(*func)(int, int, double));
double f(int p, int q, double x);
int main() {
int p;
int q;
//scanf_s("%d %d", &p, &q);
//printf_s("%.4lf\n", bisection(p, q, f));
cin >> p >> q;
cout << bisection(p, q, f) << endl;
return 0;
} double bisection(int p, int q, double(*func)(int, int, double)) {
double m = -20.0;
double n = 20.0;
double h = (m + n) / 2.0;
double u = 0.0;
while( abs((*func)(p, q, h))>EPSILON)
{
double z = (*func)(p, q, m);
double y = (*func)(p, q, n);
u = (*func)(p, q, h);
cout << u << endl;
if (z > 0 && u > 0 || z < 0 && u < 0)
{
m = (m + n) / 2;
n = n;
}
else
{
n = double(m + n) / 2;
m = m;
} h = (double)(m + n) / 2; } return h; } double f(int p, int q, double x) {
return p * x + q;
}
C++ 二分法求解方程的解的更多相关文章
- vijosP1371 方程的解
vijosP1371 方程的解 链接:https://vijos.org/p/1371 [思路] 组合公式+快速幂+高精单精. 求x^x %1000:因为x最大为2^31-1所以用快速幂在O(logx ...
- [Swift]LeetCode640. 求解方程 | Solve the Equation
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
- MATLAB求解方程与方程组
1. solve函数 ①求解单个一元方程的数值解 syms x; x0 = double(solve(x +2 - exp(x),x)); 求x+2 = exp(x)的解,结果用double ...
- Leetcode 640.求解方程
求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回"No so ...
- Java实现 LeetCode 640 求解方程(计算器的加减法计算)
640. 求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回" ...
- 方程的解_NOI导刊2010提高
方程的解 给定x,求\(a_1+a_2+...+a_k=x^x\ mod\ 1000\)的正整数解解的组数,对于100%的数据,k≤100,x≤2^31-1. 解 显然x是可以快速幂得到答案的,而该问 ...
- P1771 方程的解_NOI导刊2010提高(01)
P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...
- 【Java例题】4.4使用牛顿迭代法求方程的解
4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...
- 模拟7题解 T1方程的解
方程的解 [扩展欧几里德] 首先进行特判,两个小时基本想到了,除了a!=0,b==0,a*c<0这种情况 其次就是一般情况: 首先exgcd求出ax+by=GCD(a,b)的一组任意解 然后两边 ...
随机推荐
- Linux 帳號管理與 ACL 權限設定
1. Linux 的账号与群组1.1 使用者识别: UID 与 GID1.2 使用者账号:/etc/passwd, /etc/shadow1.3 关于群组: 有效与初始群组. groups, newg ...
- Python之旅_第一章Python入门
一.编程语言分类 1.机器语言:即计算机能听懂的二进制语言,0000 0001,直接操控硬件: 2.汇编语言:简写的英文标识符代替二进制语言,本质同样是直接操控硬件: 3.高级语言:用更贴近人类的语言 ...
- zf框架的思想及学习总结
在Php的配置文件中可以设置日志文件 dos命令进入文件夹,然后利用命令:>zf.bat create project d:/hspzf这样就可以在d盘进行创建项目文件了:然后需要把框架的Zen ...
- redis入门(14)redis集群下的数据分区存储
redis入门(10)redis集群下的数据分区存储
- eclipse版本对应的jdk版本
Installing Eclipse is relatively easy, but does involve a few steps and software from at least two d ...
- zabbix配置微信报警
首先我们先目睹下微信报警的效果 接下来我们正式开始操作. 一:注册企业微信. 打开企业微信注册:http://work.weixin.qq.com 根据以上提示填入相应的内容,然后注册即可. 二:登录 ...
- Java8新特性第3章(Stream API)
Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStream完全不是一个概念.Java8中的Stream是对集合功能的一种增强,主要用于对集合对象进 ...
- Struts(十八):通过CURD来学习PrepareInterceptor拦截器
PrepareInterceptor拦截器的用法: 1.若Action实现了Preparable接口,则Action方法需实现prepare()方法: 2.PrepareInterceptor拦截器S ...
- hdu1443 Joseph---约瑟夫环
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1443 题目大意: 一共有2k个人,分别为k个好人和k个坏人,现在我们需要每隔m个人把坏人挑出来,但是 ...
- 生成器以及yield语句
生成器以及yield语句最初的引入是为了让程序员可以更简单的编写用来产生值的序列的代码. 以前,要实现类似随机数生成器的东西,需要实现一个类或者一个模块,在生成数据的同时 保持对每次调用之间状态的跟踪 ...