[NOIP2001 提高组] 一元三次方程求解(洛谷)

这篇具有很好参考价值的文章主要介绍了[NOIP2001 提高组] 一元三次方程求解(洛谷)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[NOIP2001 提高组] 一元三次方程求解

题目描述

有形如: a x 3 + b x 2 + c x + d = 0 a x^3 + b x^2 + c x + d = 0 ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数( a , b , c , d a,b,c,d a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在 − 100 -100 100 100 100 100 之间),且根与根之差的绝对值 ≥ 1 \ge 1 1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 2 2 2 位。

提示:记方程 f ( x ) = 0 f(x) = 0 f(x)=0,若存在 2 2 2 个数 x 1 x_1 x1 x 2 x_2 x2,且 x 1 < x 2 x_1 < x_2 x1<x2 f ( x 1 ) × f ( x 2 ) < 0 f(x_1) \times f(x_2) < 0 f(x1)×f(x2)<0,则在 ( x 1 , x 2 ) (x_1, x_2) (x1,x2) 之间一定有一个根。

输入格式

一行, 4 4 4 个实数 a , b , c , d a, b, c, d a,b,c,d

输出格式

一行, 3 3 3 个实根,从小到大输出,并精确到小数点后 2 2 2 位。

样例 #1

样例输入 #1

1 -5 -4 20

样例输出 #1

-2.00 2.00 5.00

提示

【题目来源】

NOIP 2001 提高组第一题

代码

  程序使用了二分查找法来精确查找方程的实根。首先,它枚举了-100到100之间的所有整数i,作为可能根的起始值。如果f(i)为0或者f(i)与f(i+1)的乘积为负数(这意味着i和i+1之间有一个根),则使用二分法在该区间内搜索具体的根,直至区间长度小于1e-6。每找到一个根,就打印出来,并且保持根的计数。当找到三个根后,程序终止。文章来源地址https://www.toymoban.com/news/detail-815180.html

// 引入头文件
#include<bits/stdc++.h>
// 引入std命名空间,避免每次调用标准库函数时都要加上std::前缀
using namespace std;

// 定义全局变量存储方程的系数
double a, b, c, d;

// 定义函数f,计算方程ax^3 + bx^2 + cx + d的值
double f(double x)
{
    return a*x*x*x + b*x*x + c*x + d;
} 

// 主函数
int main()
{
    // 输入方程的系数
    cin >> a >> b >> c >> d;
    // i为循环变量,用于枚举可能的根
    double i;
    // count用于计数找到的根
    int count = 0;
    // 枚举-100至100之间的所有整数
    for(i = -100; i < 100; i++)
    {
        // 如果f(i)等于0,i是方程的根
        if(f(i) == 0)
        {
            // 计数加一
            count++;
            // 输出根,并保留两位小数
            printf("%.2f ", i);
            continue;
        }
        // 如果f(i)与f(i+1)的乘积小于0,说明在i和i+1之间存在根
        if(f(i) * f(i+1) < 0)
        {
            // 计数加一
            count++;
            // l和r分别为二分法的左右端点,初始时为i和i+1
            double l = i, r = i + 1;
            // 当l和r之间的距离大于1e-6时,进行二分查找
            while(r - l > 1e-6)
            {
                // mid为l和r的中点
                double mid = (r + l) / 2.0;
                // 如果f(mid)与f(l)的乘积小于0,说明根在l和mid之间
                if(f(mid) * f(l) < 0)
                    r = mid;
                else // 否则,根在mid和r之间
                    l = mid;
            }
            // 输出找到的根,并保留两位小数
            printf("%.2f ", l);
        }
        // 如果找到了三个根,退出循环
        if(count == 3) break;
    }
    // 结束程序
    return 0;
}

到了这里,关于[NOIP2001 提高组] 一元三次方程求解(洛谷)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • P1025 [NOIP2001 提高组] 数的划分———C++(动态规划、DFS)

    将整数 n n n 分成 k k k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。 例如: n = 7 n=7 n = 7 , k = 3 k=3 k = 3 ,下面三种分法被认为是相同的。 1 , 1 , 5 1,1,5 1 , 1 , 5 ; 1 , 5 , 1 1,5,1 1 , 5 , 1 ; 5 , 1 , 1 5,1,1 5 , 1 , 1 . 问有多少种不同的分法。 n , k n,k n , k ( 6 n ≤ 200 6n le

    2024年01月22日
    浏览(27)
  • P1025 [NOIP2001 提高组] 数的划分(dfs+剪枝 or dp)

    思路:暴力枚举搜索,不过要优雅剪枝一下下 1:处理重复情况--我们只需要然后方取值从前往后的时候呈现递增(可以相等,即不递减) 2:剪枝--基于上思想,剩下的“盘子”里面的数至少都大于等于当前“盘子”的数,所以我们取完当前盘子的数完,就可判断--剩下的盘子

    2024年02月14日
    浏览(23)
  • 【洛谷 P1097】[NOIP2007 提高组] 统计数字 题解(映射)

    注意 :数据可能存在加强。 某次科研调查时得到了 n n n 个自然数,每个数均不超过 1.5 × 1 0 9 1.5 times 10^9 1.5 × 1 0 9 。已知不相同的数不超过 1 0 4 10^4 1 0 4 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 共 n + 1 n+1 n + 1 行。 第一

    2024年02月09日
    浏览(36)
  • 【洛谷 P1003】[NOIP2011 提高组] 铺地毯 题解(数组+贪心算法)

    为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n n n 张地毯,编号从 1 1 1 到 n n n 。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上

    2023年04月24日
    浏览(33)
  • 【洛谷 P1328】[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题解(模拟+向量)

    石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主角之一。 蜥

    2024年02月09日
    浏览(28)
  • P1030 [NOIP2001 普及组] 求先序排列

    给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8≤8)。 共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。 共一行一个字符串,表示一棵二叉树的先序。 输入 #1 复制 输出 #1 复制

    2023年04月22日
    浏览(30)
  • 信息学奥赛一本通:1316:【例4.6】数的计数(Noip2001)

    【题目描述】 我们要求找出具有下列性质数的个数(包括输入的自然数nn)。先输入一个自然数n(n≤1000)n(n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能超过原数的一半; 加上数后,继续按此规则进行处理,直

    2024年02月10日
    浏览(28)
  • [NOIP2002 普及组] 选数#洛谷

    已知 n n n 个整数 x 1 , x 2 , ⋯   , x n x_1,x_2,cdots,x_n x 1 ​ , x 2 ​ , ⋯ , x n ​ ,以及 1 1 1 个整数 k k k ( k n kn k n )。从 n n n 个整数中任选 k k k 个整数相加,可分别得到一系列的和。例如当 n = 4 n=4 n = 4 , k = 3 k=3 k = 3 , 4 4 4 个整数分别为 3 , 7 , 12 , 19 3,7,12,19 3 , 7 , 12 , 19 时,

    2024年01月20日
    浏览(35)
  • [NOIP2009 普及组] 分数线划定#洛谷

    世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150 % 150% 150% 划定,即如果计划录取 m m m 名志愿者,则面试分数线为排名第 m ×

    2024年01月17日
    浏览(26)
  • 洛谷P1059 [NOIP2006 普及组] 明明的随机数

    1. 问题描述 2. Input 输入有两行,第 1 行为 1 个正整数,表示所生成的随机数的个数 N。第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。 3. Output 输出也是两行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。第 2 行为 M 个用空格隔开的正整数,为从小到大排好序

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包