【算法】——基础练习 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的完整表达式,以方便奶牛们做题。
不妨设
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,在打印的时候需要判断每次递归进去的n是为奇数还是偶数,因为An涉及到+-的符号问题,所以这里就多一个参数flag对n的奇偶性进行判定最后再递归打印完了之后打印出n个右括号
再递归打印出Sn(在Sn中调用An),这里涉及一个最后是1的时候右括号没有,所以在原本的基础上,需要判断,如果最开始我需要的Sn,就是S1的话,那么在递归的出口处就需要说明不打印),如果是递归到n==1的时候就打印),这里就多传入一个max进行对键盘输入n的保存,以便比较
#include<stdio.h> void printAn(int n); void printAn2(int n); void printAn3(int n,int flag); void printAn(int n); void printSn2(int n,int max); void printSn(int n,int max); int main() { int n; scanf("%d",&n); int max=n; printSn(n,max); return 0; } void printAn(int n) { int i; printAn2(n); //循环打印出An对应的右括号 for(i=0; i<n; i++) printf(")"); } void printAn2(int n) { int flag=n%2; printAn3(n,flag); } void printAn3(int n,int flag) { char c; if(n==1) { printf("sin(1"); return; } if(flag==0) { c='-'; } else if(flag) { c='+'; } printAn2(n-1); printf("%csin(%d",c,n); } //上面是递归打印An; //下面该递归打印Sn void printSn(int n,int max) { int i; //在前面循环打印出An对应的左括号 for(i=0; i<n-1; i++) printf("("); printSn2(n,max); } void printSn2(int n,int max) { if(n==1) { printAn(1); //在递归的时候要考虑如果原本最开始的n就是1的情况的括号问题 if(max=n=1) { printf("+%d",max); } else if(max!=1) { printf("+%d)",max); } } else { printSn2(n-1,max); printAn(n); if(max-n+1!=1) { printf("+%d)",max-n+1); } else if(max-n+1==1) { printf("+1"); } } }