蓝桥杯_基础练习_Sine之舞
问题
问题描述
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
仅有一个:N<201
输出格式
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例
-
输入
3 -
输出
((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1
主要思路
-
我们看出这个表达式是有一定规律的,只要我们找出这个规律,这道题就不是特别难。
- A1 = sin(1)
A2 = sin(1-sin(2))
A3 = sin(1-sin(2+sin3))
觉得还是不明显?再改一下
- A1 = sin(1
A2 = sin(1-sin(2
A3 = sin(1-sin(2+sin(3
是不是发现了规律呢,那我们再来看看
Sn
- A1 = sin(1)
-
Sn
- S1 = A1+n – sin(1)+1
S2 = (A1+n)A2+n-1)+1 – (sin(1)+2)sin(1-sin(2))+1
S3 = ((A1+n)A2+n-1)A3+1 – ((sin(1)+3)sin(1-sin(2)+2)sin(1-sin(2+sin(3)))+1
相比于A1+A2+A3直接相加,
Sn
所多出来的是开头所对应的n-1
个(
以及每项后面所加的 一个逐渐减小的n
- S1 = A1+n – sin(1)+1
-
搞清楚他们的规律,我们只需要缔造出,关于
n
的An
并且加上 他们所没有的符号,这样即可输出所对应的Sn
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner= new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
//使用StringBuffer 可以方便添加字符串
StringBuffer stringBuffer = s(n,n);
System.out.print(stringBuffer.toString());
}
}
//处理 Sn
private static StringBuffer s(int n, int n2) {
StringBuffer stringBuffer = new StringBuffer();
// 添加每个 Sn 必有的 A(1)+n
if (n==1) {
stringBuffer.append(An(1)).append("+"+n2);
}else {
// 添加Sn前面的( 。 对Sn进行递归
stringBuffer.append("(").append(s(n-1, n2)).append(")").append(An(n)).append("+"+(n2-n+1));
}
return stringBuffer;
}
//处理An
private static StringBuffer An(int x) {
StringBuffer stringBuffer = A(x);
//对每个A 后面添加相对应的 ) 数量
while (x-->0) {
stringBuffer.append(")");
}
return stringBuffer;
}
//处理单个的An,也就是每个A
private static StringBuffer A(int x) {
StringBuffer stringBuffer = new StringBuffer();
//判断添加 A1
if (x==1) {
stringBuffer.append("sin(1");
}else {
//对A进行递归,以求出关于参数X的A
stringBuffer.append(A(x-1)).append(x%2==1 ? "+":"-").append("sin("+x);
}
return stringBuffer;
}
}