问题描述
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
仅有一个数:N<201。
输出格式
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
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,内存限制那里可能会超。
文章来源: 蓝桥杯之VIP试题 Sine之舞