返回信息流求大神!!刚学到函数…
这是一条镜像帖。来源:北邮人论坛 / cpp / #93930同步于 2016/11/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
大一萌新,这次oj好难完全不会求教
p12345
2016/11/19镜像同步36 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Scala:
```
//计算sin x
import Math._
def fac(n :Int,r : Int = 1) : Int = {
if(n == 1) r else fac(n - 1,n * r)
}
def sin(x : Double) : Double = {
var result : Double = 0
var n : Int = 1
var flag = true
while(flag) {
result = result + pow(-1,n + 1) * pow(x,2 * n - 1) / fac(2 * n -1)
// println(pow(x,2 * n - 1) / fac(2 * n - 1))
n = n + 1
if((pow(x,2 * n - 1) / fac(2 * n - 1)) < pow(10,-7) ) {
if (x >= 0) flag = false
} else {
if (x < 0) flag = false
}
}
result
}
printf("测试:sin (Pi / 2) =%.6f\n",sin(PI / 2))
var x : Double = 0
try {
while (true) {
x = readDouble()
printf("%.6f\n",sin(x))
}
} catch {
case other => println("There are some errers")
}
```
C++:
```
#include <iostream>
#include <cmath>
#include <cstdio>
using std::cin;using std::cout;using std::endl;
int fac(int,int);
double pow_diy(double ,int ,double );
double sin(double);
int main(void) {
cout << "测试:sin (Pi / 2) =" << sin(M_PI/2) << endl ;
double p = 0;
while(cin >> p) {
printf("%.6f\n",sin(p));
}
return 0;
}
int fac(int n,int r)/*r = 1*/ {
if (n == 1) {
return r;
} else {
return fac(n - 1,n * r);
}
}
double pow_diy(double x,int n,double r) /*r = 1*/{
if( n == 0) {
return r;
} else if ( n < 0) {
return pow_diy(x,n + 1, r / x);
} else {
return pow_diy(x,n - 1,r * x);
}
}
double sin(double x) {
double result = 0;
int n = 1;
while(1) {
result = result + pow_diy(-1,n + 1,1) * pow_diy(x,2 * n - 1,1) / fac(2 * n -1,1);
// printf("%f\n",pow_diy(x,2 * n - 1,1) / fac(2 * n - 1,1));
// cout << pow_diy(x,2 * n - 1,1) << endl ;
++ n;
if((pow_diy(x,2 * n - 1,1) / fac(2 * n - 1,1)) < pow_diy(10,-7,1) ) {
if (x >= 0) break;
} else {
if (x < 0) break;
}
}
return result;
}
```
但是最后的精度与例子不一样,我也不知怎么回事。。
题目中最后多项式的最后一项是给出了一般形式,所以不用++n之后再和1e-7比较。只要让刚刚result加的最后一项的绝对值和它比较即可。 我也没写感觉可能是这个原因