蓝桥杯之VIP试题 Sine之舞

题目: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,内存限制那里可能会超。

猜你喜欢

转载自blog.csdn.net/qq_37905259/article/details/80596418