# 思考
我随便出几组数据,这个代码都过不了,不妨先思考看看。
示例一:
```
1
-1 0
```
示例二:
```
1
2 0
```
实例三:
```
0
12
```
# 修改
以下是基于你的狮山代码,修改而成的 **AC** 狮山
```c++
#include <cstdio>
int zf(int a)
{
if (a > 0)
return 1;
else if (a == 0)
return 0;
else if (a < 0)
return -1;
}
int cz(int a)
{
if (a == 1)
return 1;
else if (a == -1)
return -1;
else
return 0;
}
int sc(int a)
{
if (zf(a) == 1) // a > 0
{
if (cz(a) == 1) // a > 0 && a == 1
return 10; // 为正一
else if (cz(a) == 0) // a > 0 && a != 1 && a != -1
return 11; // 正数(除了一)
}
else if (zf(a) == -1) // a < 0
{
if (cz(a) == -1) // a < 0 && a == -1
return 20; // 为负一
else if (cz(a) == 0) // a < 0 && a != -1 && a != 1
return 21; // 负数(除负一)
}
// 缺 a == 0 需写:return 0;
return 0;
}
int main()
{
int n, a[105], flag = 0;
scanf("%d", &n);
for (int i = 1; i <= n + 1; i++)
{
scanf("%d", &a[i]);
}
if (n == 0)
{
printf("%d", a[1]);
return 0;
}
for (int i = 1, j = n; i <= n, j >= 1; i++, j--)
{
if (flag == 0 && sc(a[i]) != 0 && j > 1)
{
flag = 1;
if (sc(a[i]) == 10)
printf("x^%d", j);
else if (sc(a[i]) == 11)
printf("%dx^%d", a[i], j);
else if (sc(a[i]) == 20)
printf("-x^%d", j);
else if (sc(a[i]) == 21)
printf("%dx^%d", a[i], j); // 首个输出特殊
}
else if (j > 1)
{
if (sc(a[i]) == 10)
printf("+x^%d", j);
else if (sc(a[i]) == 11)
printf("+%dx^%d", a[i], j);
else if (sc(a[i]) == 20)
printf("-x^%d", j);
else if (sc(a[i]) == 21)
printf("%dx^%d", a[i], j);
}else if(j == 1 && flag == 0){
if (sc(a[i]) == 10)
printf("x");
else if (sc(a[i]) == 11)
printf("%dx", a[i]);
else if (sc(a[i]) == 20)
printf("-x");
else if (sc(a[i]) == 21)
printf("%dx", a[i]);
}else{
if (sc(a[i]) == 10)
printf("+x");
else if (sc(a[i]) == 11)
printf("+%dx", a[i]);
else if (sc(a[i]) == 20)
printf("-x");
else if (sc(a[i]) == 21)
printf("%dx", a[i]);
}
}
if (sc(a[n + 1]) == 10 && n > 0)
printf("+%d", a[n + 1]);
else if (sc(a[n + 1]) == 11 && n > 0)
printf("+%d", a[n + 1]);
else if (sc(a[n + 1]) == 20)
printf("%d", a[n + 1]);
else if (sc(a[n + 1]) == 21)
printf("%d", a[n + 1]);
else if (sc(a[n + 1]) == 0 && flag == 0)
printf("%d", 0);
return 0;
}
```
# 锐评
## 1. 错误百出
比如main函数里,在**完成输入之后**的循环
`for (int i = 1, j = n; i <= n, j > 1; i++, j--)`
它只能循环 $n-1$ 次,是你代码里最大的问题(应该将`j > 1`改为`j >= 1`)。指数为1是一种特殊情况,你不应将特殊情况抛弃
## 2. 函数命名不规范
**不要用拼音**,尤其是,你还只有首拼
`zf`, `cs`, `sc`函数名是什么意思?正负,参数,输出?
## 3. 函数冗余
不是函数越多显得越厉害
`zf`,`cs`, `sc`函数完全没必要
(即使用sc函数,直接写条件,也比这个清晰多了)
根据你的代码,我改写了你的`zf`、`cz`、`sc`函数,为:
```c++
int sc(int a){
if(a == 1) return 10;
if(a > 1) return 11;
if(a == -1) return 20;
if(a < -1) return 21;
return 0;
}
```
这是不是直观明了了很多?
而既然都能够这样写了,就不需要sc函数了,直接在main函数里写条件分支就可以了
## 4.逻辑漏洞
太多了,我不方便直接对你的代码下手,除非大改
比如:无法正确处理**常数项符号**(负数都**不要**额外输出负号;在常数项前没有任何输出时)
不全部列出了
# 建议
实在不会,看看题解吧。对自己,对别人都是好的。(这道题的第一个题解不严谨)
题解写出来,就是希望后人合理运用的
看你的代码太折磨了
# 正确解法之一
```c++
#include <bits/stdc++.h>
using namespace std;
int n, a;
bool flag;
int main(){
cin >> n;
for (int i = n; i >= 0; i--){
cin >> a;
if (a){
if (i != n && a > 0 && flag == 1) cout << "+";
if (abs(a) > 1 || i == 0) cout << a;
if (a == -1 && i) cout << "-";
if (i > 1) cout << "x^" << i;
if (i == 1) cout << "x";
flag = 1;
}else if(a == 0 && n == 0) cout << a;
}
}
```
最后还是说一句:**加油啊,少年!**
by XYCF @ 2024-03-07 02:19:11
@[XYCF](/user/824388) 谢谢啦!
by FYH666666 @ 2024-03-23 13:12:46
不用谢。我语气太冲了,可能是那天熬夜太晚了,内分泌失调。
by XYCF @ 2024-03-23 18:32:08