EOJ-2891 多次函数
http://acm.cs.ecnu.edu.cn/problem.php?problemid=2891
题意:给出一个函数解析式,画出其在定义域及值域为[-20,20]内的函数图像
用一个数组记录每个次数前对应的系数。需要注意的是算出的函数值对数组下标的转换
1 #include<map> 2 #include<set> 3 #include<list> 4 #include<cmath> 5 #include<ctime> 6 #include<queue> 7 #include<stack> 8 #include<cctype> 9 #include<cstdio> 10 #include<string> 11 #include<cstdlib> 12 #include<cstring> 13 #include<iostream> 14 #include<algorithm> 15 using namespace std; 16 char mat[41][41]; 17 int ans[4]; 18 void init(){ 19 for(int i=0;i<=40;i++) 20 for(int j=0;j<=40;j++){ 21 if(i==20){ //初始化特别考虑第20列以及20行即可,注意原点为'+' 22 if(j==20)mat[i][j]='+'; 23 else if(j==40) mat[i][j]='>'; 24 else mat[i][j]='-'; 25 continue; 26 } 27 if(j==20){ 28 if(i==0)mat[i][j]='^'; 29 else mat[i][j]='|'; 30 continue; 31 } 32 mat[i][j]='.'; 33 } 34 } 35 void draw(){ 36 for(int i=0;i<=40;i++){ 37 for(int j=0;j<=40;j++) 38 putchar(mat[i][j]); 39 printf("\n"); 40 } 41 } 42 void read(char *fx){ 43 int len=strlen(fx); 44 int sym=1,temp=0; //sym表示符号,temp存放系数 45 memset(ans,0,sizeof(ans)); //初始化为0 46 for(int i=5;i<len;i++){ 47 if(isdigit(fx[i])){ 48 temp=temp*10+(fx[i]-'0')*sym; //数字可能有多位 49 if(i==len-1) //对常数项的特殊处理,将0次幂对应的系数存入 50 ans[0]=temp; 51 } 52 if(fx[i]=='+') 53 sym=1; 54 if(fx[i]=='-') 55 sym=-1; 56 if(fx[i]=='x'){ //读到x时进行系数的处理 57 if(temp==0) //对省略系数1的特殊处理 58 temp=sym; 59 if(fx[i+1]=='^'){ 60 ans[fx[i+2]-'0']=temp; //将次幂数组存入对应系数 61 i+=2; //记住要向后移位,跳过次幂的读入 62 } 63 else 64 ans[1]=temp; //对一次幂的特殊处理 65 temp=0; //清空系数 66 } 67 } 68 } 69 int F(int x){ 70 int ret=0; 71 for(int i=0;i<4;i++) 72 ret+=ans[i]*pow(1.0*x,i); //计算对应y值,ans下标表示次幂 73 return ret; 74 } 75 int main(){ 76 char fx[30]; 77 while(cin>>fx){ 78 init(); //初始化 79 read(fx); //读入数据,存入数组 80 for(int i=-20;i<=20;i++){ 81 int pt=F(i); //计算对应的y 82 if(pt>=-20 && pt<=20) 83 mat[20-pt][i+20]='*'; //在图内则描点,注意y值是行,且向下会越来越小 84 } 85 draw(); //画图 86 } 87 return 0; 88 }