dotcpp1463-- Sine之舞(找规律)

[蓝桥杯][基础练习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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章