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;
}

 

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