记录我的刷题历程
蓝桥杯 basic21试题 基础练习 sine之舞
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
最近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
a1=sin(1);
a2=sin(1-sin(2));
a3=sin(1-sin(2+sin(3)));
1.我们可以发现下标为偶数的,增加的项都是+
而下标为奇数的,增加的项前面的符号都是-
2.每次增加的都是基于上一层的基础上的。
例如 sin(1)
在第2层中,增加的部分是-sin(2)
且增加的位置都是属于上一层下标之后,因此就很方便我们在递归中进行定位
伪代码部分
findAn(int n,string s)//n代表当前下标,s最后返回an
{
if(结束条件){
表示所有下标走完,获得了an
}
if( 偶数){
把-sin(n)加上
dfs(n+1)//进入下一步
}
else{
把+sin(n)加上
dfs(n+1)//表示下一步
}
}
}
相当于主干部分吧,
接着看sn
sn也是由一堆套娃组成的,因此也考虑采用递归形式,(其实可能可以用递推,但我不会)
s1=a1+1
s2=(a1+2)a2+1;
因为n一直在变化,
当n等于2时
s1=a1+2
s2=s1a2+1
当n等于3时
s1=a1+3
s2=s1a2+2
s3=s2a3+1
由于计算机只知道下标,所以后面的数字规律是
n+1-N(N表示当前层数,n表示输入的总层数)
因此
伪代码部分
sumSn(stringbuilder[] an,int n,stringBuilder s){
//an记录从1--n的所有子项,n表示当前层数,s表示当前层数的结果
if(m==n+1){
//结束就输出
}
//每层都需要做的操作
s=s+an[n-1]+m+1-n//把当前层的子项加上,还有后面数字也加上
正确代码部分(递归部分)
import java.util.Scanner;
public class Main {
static Scanner scanner = new Scanner(System.in);
static int m=scanner.nextInt();
static int n;
static StringBuilder a1=new StringBuilder("sin(1)");
static StringBuilder s1=new StringBuilder("sin(1)+1");
static StringBuilder[] an=new StringBuilder[m];
public static StringBuilder findAn(int N,StringBuilder s){
if (N==n+1) return s;
String a=String.valueOf(N-1);
if(N%2==0){
if(s.indexOf