PAT基础编程题目-7-18 二分法求多项式单根

PAT基础编程题目-7-18 二分法求多项式单根

题目详情


题目地址:https://pintia.cn/problem-sets/14/problems/798

解答

C语言版

#include<stdio.h>
int main() {
   
	float a0, a1, a2, a3, a, b;
	double f, fa, fb;
	scanf("%f %f %f %f", &a3, &a2, &a1, &a0);
	scanf("%f %f", &a, &b);
	// 阈值取0.01
	while ((b - a) >= 0.01) {
   
		fa = a3 * a * a * a + a2 * a * a + a1 * a + a0;
		fb = a3 * b * b * b + a2 * b * b + a1 * b + a0;
		if (fa == 0)  // 区间端点是根
		{
   
			printf("%.2f", a);
			return 0;
		}
		if (fb == 0)
		{
   
			printf("%.2f", b);
			return 0;
		}
		if (fa * fb < 0)
		{
   
			f = a3 * ((a + b) / 2.0) * ((a + b) / 2.0) * ((a + b) / 2.0) + a2 * ((a + b) / 2.0) * ((a + b) / 2.0) + a1 * ((a + b) / 2.0) + a0;
			if (f == 0)
				break;
			else if (f * fa > 0) 
				a = (a + b) / 2.0;
			else if (f * fb > 0) 
				b = (a + b) / 2.0;
		}
	}
	printf("%.2f", (a + b) / 2.0);
	return 0;
}

C++版

#include<iostream>
#include<iomanip>
using namespace std;
int main() {
   
	float a0, a1, a2, a3, a, b;
	double f, fa, fb;
	cin >> a3 >> a2 >> a1 >> a0;
	cin >> a >> b;
	// 阈值取0.01
	while ((b - a) >= 0.01) {
   
		fa = a3 * a * a * a + a2 * a * a + a1 * a + a0;
		fb = a3 * b * b * b + a2 * b * b + a1 * b + a0;
		if (fa == 0)  // 区间端点是根
		{
   
			cout << fixed << setprecision(2) << a;
			return 0;
		}
		if (fb == 0)
		{
   
			cout << fixed << setprecision(2) << b;
			return 0;
		}
		if (fa * fb < 0)
		{
   
			f = a3 * ((a + b) / 2.0) * ((a + b) / 2.0) * ((a + b) / 2.0) + a2 * ((a + b) / 2.0) * ((a + b) / 2.0) + a1 * ((a + b) / 2.0) + a0;
			if (f == 0)
				break;
			else if (f * fa > 0)
				a = (a + b) / 2.0;
			else if (f * fb > 0)
				b = (a + b) / 2.0;
		}
	}
	cout << fixed << setprecision(2) << (a + b) / 2.0;
	return 0;
}

Java版

import java.text.DecimalFormat;
import java.util.Scanner;
public class Main{
   

	public static void main(String[] args) {
   
		float a0 = 0, a1 = 0, a2 = 0, a3 = 0, a = 0, b = 0;
		double f, fa, fb;
		DecimalFormat decimalFormat = new DecimalFormat("0.00");
		Scanner scanner = new Scanner(System.in);
		if (scanner.hasNext()) {
   
			a3 = scanner.nextFloat();
			a2 = scanner.nextFloat();
			a1 = scanner.nextFloat();
			a0 = scanner.nextFloat();
			a = scanner.nextFloat();
			b = scanner.nextFloat();
		}
		scanner.close();
		// 阈值取0.01
		while ((b - a) >= 0.01) {
   
			fa = a3 * a * a * a + a2 * a * a + a1 * a + a0;
			fb = a3 * b * b * b + a2 * b * b + a1 * b + a0;
			if (fa == 0)  // 区间端点是根
			{
   
				System.out.println(decimalFormat.format(a));
				return;
			}
			if (fb == 0)
			{
   
				System.out.println(decimalFormat.format(b));
				return;
			}
			if (fa * fb < 0)
			{
   
				f = a3 * ((a + b) / 2.0) * ((a + b) / 2.0) * ((a + b) / 2.0) + a2 * ((a + b) / 2.0) * ((a + b) / 2.0) + a1 * ((a + b) / 2.0) + a0;
				if (f == 0)
					break;
				else if (f * fa > 0)
					a = (float) ((a + b) / 2.0);
				else if (f * fb > 0)
					b = (float) ((a + b) / 2.0);
			}
		}
		System.out.println(decimalFormat.format((a + b) / 2.0));
	}

}

创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢!

全部评论

相关推荐

2025年初,新的一年开始,我给自己暗暗打气,发誓今年一定要拿到offer。如今2025年即将结束,找工作仍然没有任何水花,如今的失意和落魄和年初信心满满的姿态形成鲜明对比,想必也是因为被社会毒打,认清现实了吧。先分享一下贴主的背景,本人女,本科末流985文科专业,后来保送到华五,成绩一直是班级第一,有过国奖,实习有多段头部大厂经历。发贴的直接原因是今天华为面试挂,在反思中有很多复杂的想法,包括对自身能力的怀疑、对面试官所提问题的不解、对大环境的无奈。贴主是一个说话温柔、不喜欢咄咄逼人、有点社恐的人(基本上算是人们眼中对小女生的刻板印象,所以在历次群面中基本全挂(看到大家争抢当leader、t...
在找内推的小虾米:感觉这一段经历和我好像啊,前段时间面了很多车企,面试项目经历各种被拷打,大多数都没过一面,最有希望拿offer的一个终面挂了把我干破防了,打电话给爸妈哭了一个多小时才缓过来。我也开始否定自己,否定自己的一切,包括性格,能力,成长经历。。。最后面了深圳的某家公司,面试官人都挺友好,提的问题有深度但找到切入点 ,最后hr也按岗位最高的标准给的offer,我才发现自己并没有这么不堪,只是我的能力和经验和之前的岗位要求不那么符合而已。帖主一定不要灰心,招聘的窗口期还有很长很长,保持自信扬长避短,一定有企业能发现你的闪光点,祝好。
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务