样例过了为什么是10分?

P1067 [NOIP2009 普及组] 多项式输出

# 思考 我随便出几组数据,这个代码都过不了,不妨先思考看看。 示例一: ``` 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


|