//本题我采用的是分部输出法,即依次输出符号(难点在于+号),系数(难点在于1和-1),未知数,指数。在输出每一部分时分别讨论特殊情况。
下面是我AC的代码(一刷):
#include<stdio.h>
int main() {
int i, n, a[105], flag; //数组a存储系数
scanf("%d", &n);
flag = 0; //flag为0表示是输出第一项,为1表示不是第一项。因为第一项系数为正时不输出'+',所以要特判一下
for (i = n; i >= 0; i--) { //小技巧:i直接表示指数,因为是按照指数递减输出,所以i也递减
scanf("%d", &a[i]); //一边读入一边输出
if (a[i]) { //只有系数不为0才输出
if (a[i] > 0 && flag) //输出符号,系数为正且不是第一项时要输出'+'
printf("+");
if (a[i] == -1) //系数为-1时才单独输出'-',否则'-'会随着系数一块输出的,如输出系数-2时就顺带着输出了'-'
printf("-");
if (a[i] != 1 && a[i] != -1) //不是+1和-1就直接输出系数
printf("%d", a[i]);
else if (i == 0) //如果是常数项,那么1就不能省(不用管是1还是-1,因为前面已经处理过符号了)
printf("1");
if (i) //如果不是常数项就输出未知数x
printf("x");
if (i > 1) //i == 1 时指数为1,不用输出,其他情况i就是指数
printf("^%d", i);
flag = 1; //已经输出了flag就设为1
}
}
return 0;
}
后来又刷一次,思路一样,但是代码更简洁了些,以下是代码(二刷):
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
const int INF = 0x3fffffff;
typedef long long ll;
int main() {
int n, x, flag = 0;
cin >> n;
for (int i = 0; i <= n; i++) {
cin >> x;
if (x) {
flag = 1;
//处理正负号
if (x > 0 && i) cout << "+";
if (x < 0) cout << "-";
//数字部分
if (x != 1 && x != -1) cout << abs(x);
else if (n - i == 0) cout << 1;
//指数部分
if (n - i > 1) cout << "x^" << n - i;
else if (n - i == 1) cout << "x";
}
}
if (!flag) cout << 0; //所有系数都是0时,只输出0
return 0;
}
运行结果(两次一样):