好久没做蓝桥杯的训练了,昨天做一道今天更一篇
问题
问题描述
最近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
分析
题目给了提示是用递归,并且是两个递归,一个是An,一个是Sn。
在整理递推公式的时候,我发现An的与An-1之间存在某种关系,但是在用字符串表示的时候,结尾的括号总是很碍事。想要完整的写递推公式的话还要定一个指针,因为是An是从An-1中间插入的。
那么就先把扩回去掉,在全部生成后根据n来加上)就可以了。
A1=sin(1
A2=sin(1-sin(2
A3=sin(1-sin(2+sin(3
这样递推就得到了递推公式(不会用LaTeX,只能手画,见谅,画图工具是真的不好用)
然后在结尾填上**n个)**就得到了An。
Sn同理,Sn是先将开头的多个括号去掉,就不用从中间插入了,方便找递推公式。
这里有个细节,就是在Sn中An后面会跟一个数字n0,n0与n在变化趋势上呈相反关系,即随着递归的深入,n是n–>1,而n0是1–>n,所以递归方法上还需要一个变量来存储n0。
这样就得到了两个完整的递推公式了。
代码
import java.io.BufferedInputStream;
import java.util.Scanner;
/**
* @ClassName TeachCowsMath
* @Description Sine之舞
* @author 滑技工厂 https://blog.csdn.net/qq_41718454
* @date 2020/4/2
* @version 1.0
*/
public class TeachCowsMath {
static final String sin = "sin(";
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
int N = sc.nextInt();
// String an = An2(N);
// System.out.println(an);
String sn = "";
for (int i = 1; i < N; i++) {
sn += "(";
}
sn += Sn(N, 1);
System.out.println(sn);
}
/*
* @Title An
* @Description 返回An (没有结尾括号)
* @author 滑技工厂
* @Date 2020/4/15
* @param [n]
* @return java.lang.String
* @throws
*/
public static String An(int n) {
if (n == 1)
return sin + "1";
return n % 2 == 0 ? An(n - 1) + "-" + sin + n : An(n - 1) + "+" + sin + n;
}
/*
* @Title An2
* @Description 返回An 有结尾括号的
* @author 滑技工厂
* @Date 2020/4/15
* @param [n]
* @return java.lang.String
* @throws
*/
public static String An2(int n) {
String an = An(n);
for (int i = 0; i < n; i++) {
an += ")";
}
return an;
}
/*
* @Title Sn
* @Description 返回Sn 没有开头括号
* @author 滑技工厂
* @Date 2020/4/15
* @param [n, n1是An后面加的那个数,与n的变化相反]
* @return java.lang.String
* @throws
*/
public static String Sn(int n, int n1) {
return n == 1 ? An2(n) + "+" + n1 : Sn(n - 1, n1 + 1) + ")" + An2(n) + "+" + n1;
}
}
本篇结束!!