[蓝桥杯][基础练习VIP]Sine之舞
时间限制: 1Sec 内存限制: 128MB 提交: 1349 解决: 859
题目描述
最近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)))
Sn:
S1=A1+1
S2=(A1+2)A2+1
S3=((A1+3)A2+2)A3+1
对于A :两个相邻的式子之间是有关系的,后一个是由前一个拼接而来,可以递归,也可以迭代
对于S:两个相邻的式子之间并没有关系,只需要调用An函数即可,可以递归,也可以迭代
这里对字符串的操作使用的是c++的string类,使得字符串的拼接变得简单很多
主要是自己一开始把An写错了,直到检查Sn的时候才发现问题
迭代版:
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<vector>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int _read() {
char ch = getchar();
int sum = 0;
while (!(ch >= '0' && ch <= '9'))ch = getchar();
while (ch >= '0' && ch <= '9')sum = sum * 10 + ch - 48, ch = getchar();
return sum;
}
const int inf=0x3f3f3f3f;
const int mm=0;
int n;
string A(int x){
string Ax="sin(1";
for(int i=2;i<=x;i++){
Ax+=i&1?'+':'-';
Ax+="sin(";
Ax+=i+'0';
}
for(int i=1;i<=x;i++)
Ax+=")";
return Ax;
}
string S(int x){
string Sx;
for(int i=1;i<x;i++)
Sx+="(";
for(int i=1;i<=x;i++){
Sx+=A(i);
Sx+='+';
Sx+=x-i+1+'0';
if(i==x)//+1后面没有 ")"
break;
Sx+=")";
}
return Sx;
}
int main()
{
cin>>n;
cout<<S(n);
return 0;
}
递归版(还是迭代的简单,写递归版纯属是找抽):
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<vector>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int _read() {
char ch = getchar();
int sum = 0;
while (!(ch >= '0' && ch <= '9'))ch = getchar();
while (ch >= '0' && ch <= '9')sum = sum * 10 + ch - 48, ch = getchar();
return sum;
}
const int inf=0x3f3f3f3f;
const int mm=0;
int n;
string ast="sin(1";
string A(int s,int e,string str){//构造A表达式 s为当前值,e为最大值
if(s==e){
for(int i=1;i<=e;i++)
str+=")";
return str;
}
str+=s&1?'-':'+';
str+="sin(";
str+=(s+1+'0');
return A(s+1,e,str);
}
string An(int x){//返回 Ax
return A(1,x,ast);
}
string S(int s,int e,string str){//构造S表达式 s为当前值,e为最大值
if(s==1)
for(int i=1;i<e;i++)
str+="(";
if(s==e){
str+=An(e);
str+="+1";
return str;
}
str+=An(s);
str+="+";
str+=e-s+1+'0';
str+=")";
return S(s+1,e,str);
}
string Sn(int x){//返回 Sx
return S(1,x,sst);
}
int main()
{
cin>>n;
cout<<Sn(n);
return 0;
}