3597 - 【基础题】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

C++解答

#include<iostream>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;

// 求An 
void An(string &an, int i, int flag, int n)
{
	// an:字符串an
	// i:用于循环1-n
	// flag:用于记录序号
	// n:题目中的n
	
	// itoa 的参数是字符类型指针,返回值是一个指针,指向的是一个字符串 
	// N < 201故 
	//char ch[4];
	//itoa(i, ch, 10);
	
	// 用下面的流处理可以使代码更加清晰 
	stringstream stream;  
    stream << i;  
    string string_temp = stream.str();   //此处也可以用 stream>>string_temp  
	an += "sin(" + string_temp;
	if(i < n)
	{
		// 符号 
		if(flag)
		{
			an += "-";
		}
		else
		{
			an += "+";
		}
		flag = !flag;
		
		// 递归调用 
		An(an, i+1, flag, n);
	}
	an += ")";
}

// 求Sn
void Sn(string &te, int i, int n) 
{
	// te:存储结果的字符串 
	
	// 生成该层括号内的字符串 
	string string_temp;
	An(string_temp, 1, 1, i);
	
	// 将数字转换成字符 
	stringstream stream;  
    stream << n-i+1;  
    string string_temp2 = stream.str();   //此处也可以用 stream>>string_temp
	
	string_temp +=  "+" + string_temp2;
	
	if(i > 1)
	{
		te = "(" + te;
		Sn(te, i-1, n);
	} 
	
	// 最外层没有)符号 
	if(i == n)
	{
		te += string_temp;
	}
	else
	{
		te += string_temp +")";
	}
	
 
}

int main()
{
	string re;	// 结果字符串
	
	int n;
	cin >> n;	
	
	// 递归从外层往里循环 
	Sn(re, n, n);
	
	cout << re;
	
	return 0;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题