算法提高 7-2求arccos值
时间限制:10.0s 内存限制:256.0MB
提交此题
问题描述
利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[-1, 1],返回值为[0, PI]。要求结果准确到小数点后5位。(PI = 3.1415926)
提示:要达到这种程度的精度需要使用double类型。
样例输入
0.5
样例输出
数据规模和约定
-1 <= x <= 1, 0 <= arccos(x) <= PI。
原本以为这是一道水题,用了暴力法,然后从0开始,因为看到题目后面说精度要达到小数点后五位,于是我把第增量尽可能小,每次增加0.000001,然后在while循环中用fabs函数判断该数的cos值是否和输入的值相近,如果是,则可以认为这时候已经遍历到正确值附近,输出!
到这里一切都看似很正常对吧?可是当我提交到lanqiao练习系统时,发现只有33分,于是我在键入其他数据进行测试,发现只有输入0.5时候,结果是相符的,如果输入-1,得出来的是3.14018,而题目中提供的PI是3.1415926,正确应该输出3.14018。下面我贴出我原来这道题的代码,至今我想不明白,我代码中哪个地方出错了,如果有哪位大神看的出来,麻烦指示以下!
#include<iostream>
#include<math.h>
#include<cstdlib>
#include<iomanip>
using namespace std;
int main()
{
double x;
cin>>x;
double i=0;
while(fabs(cos(i)-x)>0.000001)
{
i+=0.000001;
}
cout<<fixed<<setprecision(5)<<i;
return 0;
}
//-1
//3.14018
然后我Google了一下,发现别人的做法出乎意料的简便,直接无视题目中的cos函数和fabs函数,直接使用标准库中的acos函数去求,惊呆了,像我们这种孤陋寡闻的,都不知道标准库中有这么方便的函数,还傻乎乎的被题目骗去使用cos函数,我觉得这其实像是一种作弊,或许叫做小技巧。话不多说,贴出这段代码出来。
#include<stdio.h>
#include<math.h>
int main()
{
double x;
scanf("%lf",&x);
printf("%.5lf",acos(x));
}
看了这份代码,我觉得我有两点收获是:
- 要了解Math.h中基本函数的用法,不懂得使用就吃亏了,C 标准库- <math.h>
- C语言有比c++函数有一个很大优势就是在输入和输出方面,可以很便捷的进行输入输出格式化控制,比如你想输出一个双精度的小数点后五位,您可以printf(“%.5lf”,a);当然我这么说只是很浅显的说法,更加详细可以参考这篇文章:C语言输出函数(printf)和输入函数(scanf)