[藍橋杯][基礎練習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;
}