洛谷P1067 多项式输出

..

题目描述

一元nn次多项式可用如下的表达式表示:

f(x)=a_nx^n+a_{n-1}x^{n-1}+cdots +a_1x+a_0,a_n e 0f(x)=anxn+an1xn1++a1x+a0,an0

其中,a_ix^iaixi称为ii次项,a_iai 称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

  1. 多项式中自变量为xx,从左到右按照次数递减顺序给出多项式。

  2. 多项式中只包含系数不为00的项。

  3. 如果多项式nn次项系数为正,则多项式开头不出现“+”号,如果多项式nn次项系数为负,则多项式以“-”号开头。

  4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于00次的项,其系数的绝对值为11,则无需输出 11)。如果xx的指数大于11,则接下来紧跟的指数部分的形式为“x^bxb”,其中 bb为 xx的指数;如果 xx的指数为11,则接下来紧跟的指数部分形式为“xx”;如果 xx 的指数为00,则仅需输出系数即可。

  5. 多项式中,多项式的开头、结尾不含多余的空格。

输入输出格式

输入格式:

输入共有 22 行

第一行11 个整数,nn,表示一元多项式的次数。

第二行有 n+1n+1个整数,其中第ii个整数表示第n-i+1ni+1 次项的系数,每两个整数之间用空格隔开。

输出格式:

输出共 11 行,按题目所述格式输出多项式。

输入输出样例

输入样例#1: 复制
5 
100 -1 1 -3 0 10
输出样例#1: 复制
100x^5-x^4+x^3-3x^2+10
输入样例#2: 复制
3 
-50 0 0 1 
输出样例#2: 复制
-50x^3+1 

说明

NOIP 2009 普及组 第一题

对于100%数据,0 le n le 1000n100,-100 le100≤系数le 100100

..

题解:这题真是口区心心。。。

一开始以为很简单。后来从50->40--40--40分,最后一口气AC了.

自己敲几个 01 01 11 00之类的数据调试即可。

看了题解说倒数第二项因为是一次方所以才知道要特殊处理orz

而且,更坑的是,它未必就一定是 第一项最高次没有符号,而是第一次出现的那一项没有加号,所以用nosign变量记录是否出现了第一个项,同时如果全是零,也要特判输出0.

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <stdio.h>
 5 #include <cstring>
 6 #include <string>
 7 #include <cstdlib>
 8 #include <queue>
 9 #include <stack>
10 #include <set>
11 #include <vector>
12 #include <map>
13 #include <list>
14 #include <iomanip>
15 #define maxn 10000
16 //#include <>
17 using namespace std;
18 int main()
19 {
20     int n,x,sign=0,nosign=0;
21     int last=0;
22     scanf("%d",&n);
23     for(int i=n;i>=0;i--)
24     {
25         nosign=0;
26         scanf("%d",&x);
27         if(i==n)
28             last=x;
29         else{
30             if(last==0)
31                 nosign=1;
32             last=1;
33         }
34         if(x==0)
35             {
36                 sign++;
37                 continue;
38             }
39         //头部:没有头符号,直接输出x和几次方 
40         if(i==n){
41             if(x==1||x==-1)
42             {
43                 if(x<0)
44                     printf("-");
45                 printf("x^%d",i);
46             }
47             else{
48                 printf("%dx^%d",x,i);
49             }    
50             
51         }
52         //倒数第二项
53         else if(i==1)
54         {
55             if(x==1||x==-1)
56             {
57                 if(x<0&&!nosign)
58                     printf("-");
59                 else if(x>0&&!nosign){
60                     printf("+");
61                 }
62                 printf("x");
63             }
64             else{
65                 if(x>0&&!nosign)
66                     printf("+");
67                 printf("%dx",x);
68             }
69         } 
      //中部
70 else if(i!=0){ 71 if(x>0&&!nosign) 72 printf("+"); 73 if(x==1||x==-1) 74 { 75 if(x<0) 76 printf("-"); 77 printf("x^%d",i); 78 } 79 else{ 80 printf("%dx^%d",x,i); 81 } 82 83 } 84 //尾部:输出x。 85 else{ 86 if(x>0&&!nosign) 87 printf("+"); 88 printf("%d",x); 89 } 90 } 91 if(sign==n) 92 cout<<"0"; 93 printf(" "); 94 return 0; 95 }
原文地址:https://www.cnblogs.com/greenaway07/p/10969411.html