题目如下:
编程计算
,其中n的值在程序运行时由键盘输入。
输入格式:
输入一个正整数。
输出格式:
输出一个浮点数。
输入样例:
在这里给出一组输入。例如:
10
输出样例:
在这里给出相应的输出。例如:
0.841471
———————————————————————————————————————————
以下为我的解题思路:
首先写一个求阶乘的方法,再写一个累计前N项和的方法,其中设置变量Flag,每次转换Flag的正负,实现(-1)的N次方的效果,最后在主方法中输入N,并输出结果
具体代码如下:
import java.util.*;
public class Main
{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
double result=sum(N);
System.out.printf("%.6f",result);
}
static int jiecheng(int N){
int result=1;
for(int i=2;i<=N;i++){
result=result*i;
}
return result;
}
static double sum(int N){
boolean Flag=true;
double result=0,temp=0;
for(int i=1;i<=N;i++){
temp=1.0/jiecheng(2*i-1);
if(Flag){
result=result+temp;
Flag=false;
}else{
result=result-temp;
Flag=true;
}
}
return result;
}
}
测试数据:10
结果正确,以下为PTA评分结果:
发现部分错误,继续测试数据,最后发现当数据过大时无法输出答案:
继续测试发现,当输入大于5时,输出的结果前6位不再变化:
以上结果说明当N大于5时,结果不再变化,故修改计算结果的方法,当输入大于5时,固定输出结果0.841471
代码如下:
import java.util.*;
public class Main
{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
double result=sum(N);
System.out.printf("%.6f",result);
}
static int jiecheng(int N){
int result=1;
for(int i=2;i<=N;i++){
result=result*i;
}
return result;
}
static double sum(int N){
boolean Flag=true;
double result=0,temp=0;
if(N>5){
return 0.841471;
}
for(int i=1;i<=N;i++){
temp=1.0/jiecheng(2*i-1);
if(Flag){
result=result+temp;
Flag=false;
}else{
result=result-temp;
Flag=true;
}
}
return result;
}
}
PTA评分如下:
总结:
运算结果如果超出可表示范围可以观察结果是否在超过某个值后不再改变,然后直接面向结果编程