样例过了为什么是10分?

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

FYH666666 @ 2024-02-28 18:21:20

#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){
        if(cz(a)==1) return 10;//为正一 
        else if(cz(a)==0) return 11;//正数(除了一) 
    }
    else if(zf(a)==-1){
        if(cz(a)==-1) return 20;//为负一 
        else if(cz(a)==0) return 21;//负数(除负一) 
    }
} 
int main(){
    int n,a[105],flag=0;
    scanf("%d",&n);
    for(int i=1;i<=n+1;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1,j=n;i<=n,j>1;i++,j--){
        if(flag==0&&sc(a[i])!=0){
            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(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);
        }
    }
    if(sc(a[n+1])==10) printf("+%d",a[n+1]);
    else if(sc(a[n+1])==11) 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) printf("%d",0);
    return 0;
}

by XYCF @ 2024-03-07 02:19:11

思考

我随便出几组数据,这个代码都过不了,不妨先思考看看。

示例一:

1
-1 0

示例二:

1
2 0

实例三:

0
12

修改

以下是基于你的狮山代码,修改而成的 AC 狮山

#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. 函数冗余

不是函数越多显得越厉害

zfcs, sc函数完全没必要

(即使用sc函数,直接写条件,也比这个清晰多了)

根据你的代码,我改写了你的zfczsc函数,为:

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.逻辑漏洞

太多了,我不方便直接对你的代码下手,除非大改

比如:无法正确处理常数项符号(负数都不要额外输出负号;在常数项前没有任何输出时)

不全部列出了

建议

实在不会,看看题解吧。对自己,对别人都是好的。(这道题的第一个题解不严谨)

题解写出来,就是希望后人合理运用的

看你的代码太折磨了

正确解法之一

#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 FYH666666 @ 2024-03-23 13:12:46

@XYCF 谢谢啦!


by XYCF @ 2024-03-23 18:32:08

不用谢。我语气太冲了,可能是那天熬夜太晚了,内分泌失调。


|