题目描述
给定从8 88次项到常数项的多项式系数,你需要将多项式格式化为可读形式,移除不必要的字符。例如,给定系数0, 0, 0, 1, 22, -333, 0, 1, -1,应输出x^5 + 22x^4 - 333x^3 + x - 1。
格式化规则
- 项必须按次数降序排列
- 指数应放在
^后面 - 常数项只显示常数
- 只显示非零系数的项,除非所有系数均为零,此时显示常数项
- 唯一空格是二元
+和-运算符两侧各一个空格 - 首项若为正,不显示符号;若为负,显示负号(如
-7x^2 + 30x + 66) - 负项应显示为减号后跟正数(首项负除外)
- 系数1 11和− 1 -1−1只在常数项显示数字,其他项只显示符号(如
-x^3 + x^2 + 3x - 1)
输入格式
输入一行或多行,每行包含9 99个整数(系数,从8 88次到常数项),用空格分隔。系数绝对值小于1000 10001000。
输出格式
每行输出一个格式化后的多项式。
样例输入
0 0 0 1 22 -333 0 1 -1 0 0 0 0 0 -55 5 0 0样例输出
x^5 + 22x^4 - 333x^3 + x - 1 -55x^2 + 5x题目分析
问题的本质
这是一个多项式字符串格式化问题。需要根据一系列格式化规则将系数数组转换为可读的多项式字符串。
关键规则
| 规则 | 说明 |
|---|---|
| 首项符号 | 正不显示,负显示- |
| 后续项符号 | 正显示+,负显示- |
| 系数 1 或 -1 | 不显示数字(常数项除外) |
| 指数 1 | 不显示指数 |
| 零系数 | 不显示该项 |
| 全零 | 输出0 |
参考代码
// Polynomial Showdown// UVa ID: 392// Verdict: Accepted// Submission Date: 2016-06-27// UVa Run Time: 0.040s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;boolheadTermSetted=false;// 是否已输出首项// 输出一项inlinevoidterm(intcoefficient,intdegree){// 常数项特殊处理if(degree==0){if(headTermSetted){if(coefficient==0)return;cout<<(coefficient>0?" + ":" - ");cout<<abs(coefficient);}else{cout<<coefficient;}return;}// 系数为 0,跳过if(coefficient==0)return;// 非首项,输出符号if(headTermSetted){cout<<(coefficient>0?" + ":" - ");if(abs(coefficient)>1)cout<<abs(coefficient);}else{// 首项if(abs(coefficient)>1)cout<<coefficient;elseif(coefficient<0)cout<<"-";}// 输出 x 和指数cout<<"x";if(degree>1)cout<<"^"<<degree;headTermSetted=true;}intmain(intargc,char*argv[]){ios::sync_with_stdio(false);intc8,c7,c6,c5,c4,c3,c2,c1,c0;while(cin>>c8>>c7>>c6>>c5>>c4>>c3>>c2>>c1>>c0){headTermSetted=false;term(c8,8);term(c7,7);term(c6,6);term(c5,5);term(c4,4);term(c3,3);term(c2,2);term(c1,1);term(c0,0);// 如果所有系数都为零,常数项已在 term 中输出// term(0,0) 会输出 0cout<<endl;}return0;}