4496 蓝桥杯 求函数零点 简单

4496 蓝桥杯 求函数零点 简单

debd26b9227c44ee814fec330d61bafa.png

407b748b570b47709ede20c45a3133c3.png

//C风格解法1,通过率100%
#include <bits/stdc++.h>  

// int a, b; 一定会自动初始化为 0

int main(){
  int a = 2, b = 3;	// 定义a,b,不会自动初始化,最好自己定义时初始化
  // windows环境下a值固定,非windows环境,如linux环境下a值不固定,即一个随机值
  scanf("%dx^2-%d", &a, &b);

  double ans = sqrt((double) b / a);
  //ans * ans <= b / a
  //(ans + 1e-4) * (ans + 1e-4) > b / a 
  ans = floor(ans * 10000) / 10000;	
  // floor是向下取整,ceil是向上取整
  //floor(1.3) = 1.0,ceil(1.3)= 2.0
  
  printf("%.4lf\n", ans);
  return 0;
}



C++ 在线工具 | 菜鸟工具 (jyshare.com)

//C++风格解法2,通过率100%,不能使用C++在线工具,在官方练习网站可以通过,去掉注释后速度更快
#include <bits/stdc++.h>

int main(){
	std::ios::sync_with_stdio(false);std::cin.tie(nullptr);
	std::cout.tie(nullptr);	
	//取消读入输出的同步流,取消后不能使用 scanf 和 printf
	std::string s;
	std::cin >> s;	//读入 ax^2 - b 这个形式的字符串读入,假设 s = "101x^2 - 987"
	int a = 0, b = 0, n = (int) s.size(); // s.size() / s.length() 是字符串s的 大小 或 长度,s = s[0]s[1]...s[n - 1]
    //string / vector / set / map / list /...所有的STL的内部大小都可以用size(), 而 length() 是 string 独有的
	// a = 0, s = "101x^2 - 987"
	// i = 0, a = a * 10 + '1' - '0' = 1
	// i = 1, a = a * 10 + '0' - '0' = 10
	// i = 2, a = a * 10 + '1' - '0' = 101
	// i = 3, s[i] = 'x', break
	for(int i = 0; i < n; i++){
		if(s[i] == 'x')break;
		a = a * 10 + s[i] - '0'; // 正字符串转整型
	}
	
	int c = 1; // 记录当前位是 10 的多少次
	for(int i = n - 1 ; i >= 0; i--){	// 从后往前
		if(s[i] == '-')break;
		b = b + (s[i] - '0') * c; // 反字符串转整型
		c *= 10;
	}
	// b = 0, c = 1, s = "101x^2 - 987"
	// i = n - 1, b = b + ('7' - '0') * c = 7, c = c * 10 = 10
	// i = n - 2, b = b + ('8' - '0') * c = 87, c = c * 10 = 100
	// i = n - 3, b = b + ('9' - '0') * c = 987, c = c * 10 = 1000
	// i = n - 4, s[i] = '-',break
	double ans = sqrt((double) b / a);
	ans = floor(ans * 10000) / 10000;

	std::cout << std::fixed << std::setprecision(4) << ans << '\n';    
    //没有floor,则6入,输出 x 保留n位小数

    //special judge(spj),做答案正确性判断,一些问题中,小的精度误差不关心,
    //如 1.0001 和 1.0002		蓝桥杯spj判题,赛场精度要求不会这么高
	
    return 0;
}

1.求函数零点 - 蓝桥云课 (lanqiao.cn)

#include <bits/stdc++.h>
using namespace std;

int main()
{
   //不用floor的话,“4舍6入5凑偶”,"5凑偶"根据5后面的数字来定,
   //当5后有数时,舍5入1;当5后无数或为0时,需要分两种情况来讲:
   //①5前为奇数,舍5入1;②5前为偶数,舍5不进。
   std::cout << std::fixed << std::setprecision(2) << 1.0051 << '\n';	//1.01
   std::cout << std::fixed << std::setprecision(2) << 1.015 << '\n';	//1.01,5前为奇,但没入,可简记6入
   std::cout << std::fixed << std::setprecision(2) << 1.005 << '\n';	//1.00
   std::cout << std::fixed << std::setprecision(2) << 1.006 << '\n';	//1.01
   std::cout << std::fixed << std::setprecision(2) << 1.016 << '\n';	//1.02
   return 0;
}

C++ 在线工具 | 菜鸟工具 (jyshare.com) 

setprecision():控制输出流显示浮点数的数字个数,setprecision(n)就是输出的n个数字(不包含小数点),四舍五入,头文件iomanip。当 n > 数字个数 且 小数部分末尾为0时,0不输出,需使用showpoint。

setprecision()与fixed共用,保留小数

double x = 20.78;

cout<<setprecision(3)<<x<<endl;        //20.8

setprecision() 与fixed 和 showpoint 共用时:

double x = 456.0;

cout << x << endl;        //456

double x = 456.0;

cout <<showpoint<< x << endl;        //456.000

double x = 456.0;

cout <<fixed<<setprecision(2)<<showpoint<< x << endl;        //456.00

实际上,当同时使用 fixed 和 setprecision 操作符时,不需要使用 showpoint 操作符。

double x = 456.0;

cout << fixed << setprecision(2) << x << endl;        //456.00

取消同步流后,C++ 和 C 的输入输出不能混用,混用会导致某些未定义的错误。

sqrt() 函数用于计算给定参数的平方根,其函数定义如下:

double sqrt(double x);

其中,x 表示要计算平方根的参数,sqrt() 函数返回的是 x 的平方根,返回值类型是 double 型。

需要注意的是,参数 x 必须是一个非负实数,否则将出现错误。如果 x 是负数,sqrt() 函数将返回 NaN(Not-a-Number)值,如果 x 是正无穷,则返回正无穷。

int a, b;    //mian()函数中定义a,b,不会自动初始化,最好自己定义时初始化


windows环境下a值固定,非windows环境,如linux环境下a值不固定,即一个随机值

//double ans = sqrt((double) b / a);
//double ans = sqrt(b /(double) a);
//double ans = sqrt((double)b /(double) a);

在 C/C++ 中,int 是整除运算,如 3/2 = 1,double /int 或 int /double 或 double /double 都是真除法

//double ans = sqrt(1.0 * b / a);
//double ans = sqrt(b / a);		//1.000000

1.0 * b 是double ,1.0 * b / (int)a 是double    

a * x ^2 - b = 0,x = sqrt( b / a)

x 满足:f(x) <= 0 且 f(x + 0.0001) > 0,用向下取整,而不是四舍五入(本文中可说是 6 入)

ans * ans <= b / a,(ans + 1e-4) * (ans + 1e-4) > b / a 
ans = floor(ans * 10000) / 10000;    

// floor是向下取整,ceil是向上取整
//floor(1.3) = 1.0,ceil(1.3)= 2.0
//ans = ceil(ans * 10000) / 10000;    //1.2248    %.4lf
//ans = (ans * 10000) / 10000;    //1.2247    %.4lf        通过率60%,部分用例结果不与floor相同
 

//0.12345 * 10000 = 1234.5,floor(1234.5) = 1234.0,1234.0 / 10000 = 0.1234
//0.12345 * 10000 = 1234.5,ceil(1234.5) = 1235.0,1235.0 / 10000 = 0.1235

b27aaa3cc3b34288975887b6c7d3d848.png

reference:

C语言sqrt函数:求平方根 (biancheng.net)


C 强制类型转换 | 菜鸟教程 (runoob.com)


C/C++ 取整函数ceil(),floor(),向上取整,向下取整_向下取整 ceil-CSDN博客

C++算法比赛技巧——取消同步流、不使用endl_c++关闭同步流-CSDN博客

cout<< 精度控制 setprecision、fixed、showpoint的用法总结_cout setprecision-CSDN博客
 

C++ showpoint操作符 - fatalfake - 博客园 (cnblogs.com)四舍五入 为何5时分奇偶_百度知道 (baidu.com)C++ showpoint操作符 - fatalfake - 博客园 (cnblogs.com)如何看待 NOIP2020 某选手通过修改输入文件获得了第三题的满分? - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值