题目:VIP试题 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
答案:
import java.util.*;
public class Main
{
/**
*
1
sin(1)+1
2
(sin(1)+2)sin(1-sin(2))+1
3
((sin(1)+3)sin(1-sin(2))+2)sin(1-sin(2+sin(3)))+1
4
(((sin(1)+4)sin(1-sin(2))+3)sin(1-sin(2+sin(3)))+2)sin(1-sin(2+sin(3-sin(4))))+1
* @param args
*/
// 思路:要得到Sn,就必须先得到An。像这种类型的题目,首先写出Sn、An的几个例子,然后分析其中的规律。
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
int t = in.nextInt();
System.out.println(S(t));
}
public static String S(int t) // 产生Sn的函数
{
// 将结果放入str中,
String str = "";
// 先确定左括号
for(int i = 1; i < t; i++)
{
str = str + "(";
}
// 定好左括号后,就先调用方法产生An
for(int i = 1, j = t; i <= t; i++, j--)
{
str = str + A(i) + "+" + j + ")"; // 期间调用产生An 的函数
}
str = str.substring(0, str.length() - 1);
// 去掉多于的")",也可以用StringBuffer的形式
// StringBuffer str2 = new StringBuffer(str);
// str2.deleteCharAt(str2.length() - 1); // 因为多产生了一个 “)”
return str;
}
// public static StringBuffer A(int i)
public static String A(int i)
{
// 存放产生的An的结果序列
// 分析找出An的规律
// A1 = sin(1)
// A2 = sin(1-sin(2))
// A3 = sin(1-sin(2+sin(3)))
// A4 = sin(1-sin(2+sin(3-sin(4))))
String str = "sin(";
int t = 1;
for(; t < i; t++)
{
if(t % 2 != 0)
{//若t为奇数
str = str + String.valueOf(t) + "-sin(";
}
else
{
str = str + String.valueOf(t) + "+sin(";
}
}
str = str + String.valueOf(t);
for(; t > 0; t--)
{
str = str + ")";
}
return str;
// 下面是别人的方法,我觉得不好
// String str = "";
// for(int t = 1; t <= i; t++)
// {
// if(t % 2 != 0)
// {
// str = str + "+" + "sin(" + t; // 这样会使弟一项也会有一个“+” 所以后续得去掉
// }
// else
// {
// str = str + "-" + "sin(" + t;
// }
// }
// for(int t = 1; t <= i; t++)
// {
// str = str + ")";
// }
// StringBuffer str2 = new StringBuffer(str); // 因为多产生了一个“+”号
// str2.deleteCharAt(0);
// return str2;
}
}
个人小结:
别人用了StringBuffer,我用的是String。因为我无法测试,有种猜想就是若我用的是String,内存限制那里可能会超。