问题:7 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
思路:
An的构造类似于树的中序遍历
Sn最后没有被括号包起来的那部分没有想到怎么用递归实现,只能抽离到main函数中单独赋值,
虽然写出来了,但总感觉代码很粪
代码实现:
#include<bits/stdc++.h>
using namespace std;
int N;
string A,S;
void SetAn(int n,int finish)
{
stringstream ss;
ss<<n;
if(n==finish)
{
A+="sin("+ss.str()+")";
return;
}
else
{
A+="sin("+ss.str()+(n%2==0?"-":"+");
SetAn(n+1,finish);
A+=")";
}
}
void SetSn(int n)
{
stringstream ss;
ss<<n+1;
if(n==N)
{
// SetAn(n);
// S+=A+"+"+ss.str();
// A="";
return;
}
else
{
S+="(";
SetSn(n+1);
SetAn(1,N-n);
S+=A+"+"+ss.str()+")";
A="";
}
}
int main()
{
cin>>N;
SetSn(1);
SetAn(1,N);
S+=A+"+"+"1";
cout<<S;
}