C/C++ Zoj1720 Polynomial Showdown(多项式摊牌)

一、题目大意:

      每行输入9个数,这9个数是对应一元多项式的系数。然后,输出对应的一元多项式。

      (1)术语必须按递减顺序输出,就是说一元多项式需要从高指数项往低指数项输出;

      (2)指数应出现在插入符号“^”之后;

      (3)常数项仅显示为常数(指一元多项式的最后一项,此时指数为0);

      (4)只应出现具有非零系数的项,除非所有项都具有零系数,在这种情况下应出现常数项;

      (5)唯一的空格应该是+或者 - 运算符两侧的单个空格;

      (6)如果一元多项式最高项系数是正数的,那么在它之前不应该有其它符号; 负数应以减号开头,如-7x ^ 2 + 30x + 66。

      (7)系数为负数的,前面不能有“+”号。 也就是说,输出应该是x ^ 2  -  3x,而不是x ^ 2 + -3x;

      (8)常数1和-1应仅作为常数项出现。 也就是说,输出应显示为-x ^ 3 + x ^ 2 + 3x  -  1,而不是-1x ^ 3 + 1x ^ 2 + 3x ^ 1  -  1。

二、思路:a1x^8 + a2x^7 + a3x^6 + …. + a7x^2 + a8x + a9

      (1)存储方式:用数组arr[10]存储每行输入的9个整数;

      (2)输出:A.首先输出系数前面的"+"或者"-"运算符,同时考虑符号两侧是否需要空格;

                          B.接着输出系数的绝对值,考虑等于1时,出了常数项外,其它项要省略1;

                          C.输出"x^"或"x",同时考虑指数大于1时,需要输出指数,等于1时,不需要输出;(常数项没有x)

                          D.当全部为0时,虽然此时是常数,结果为0,但最好写进去;

三、错误程序:超时(Time Limit Exceeded),原因:用了一个while(1)永远循环,这个也是很多新手容易犯的错误

#include <iostream>
using namespace std;

int main() {
    int arr[10], i, first, iFab, exp;
    
    while(1) {
        first = 1;
        for(i = 0; i < 9; i++)
            cin >> arr[i];
        for(i = 0; i < 9; i++) {
            if(arr[i] == 0)
                continue;
            if(first) {
                if(arr[i] < 0)
                    cout << "-";
                first = 0;
            }
            else
            {
                if(arr[i] < 0)
                    cout << " - ";
                else
                    cout << " + ";
            }
            if(arr[i] < 0)
                iFab = -arr[i];
            else
                iFab = arr[i];
            exp = 8 - i;
            if(iFab != 1 && exp >= 1)
                cout << iFab;
            if(exp == 0)
                cout << iFab;
            if(exp > 1)
                cout << "x^" << (8-i);
            else if(exp == 1)
                cout << "x";
        }
        if(first)
            cout << "0";
        cout << endl;
    }
    return 0;
}

四、优化程序(正确):将while(1)改为while(cin >> arr[0]),有数才输入运行。这样就可以AC了。

#include <iostream>

using namespace std;



// 求绝对值

//int Fabs(int a) {

//    if(a < 0)

//        return -a;

//    return a;

//}



int main(int argc, const char * argv[]) {

    int arr[10], i, first, iFab, exp; // iFab存储系数的绝对值,exp存储指数

    

    while(cin >> arr[0]) {

        first = 1; // 标记第一项输出

        // 输入9个数

        for(i = 1; i < 9; i++)

            cin >> arr[i];

        // 输出一元多项式: 不能出现全部系数都是0,如果是,就为0,常数项了。

        for(i = 0; i < 9; i++) {

            if(arr[i] == 0) // 为0,直接跳过

                continue;

            // 输出系数前面的“+”和“-”符号

            if(first) { // 系数不为0的第一项输出

                if(arr[i] < 0)

                    cout << "-";

                first = 0;

            }

            else

            {

                if(arr[i] < 0)

                    cout << " - ";

                else

                    cout << " + ";

            }

            // 输出系数

//             iFab = Fabs(arr[i]); // 求绝对值

            if(arr[i] < 0)

                iFab = -arr[i];

            else

                iFab = arr[i];

            exp = 8 - i; // 指数

            if(iFab != 1 && exp >= 1) // 系数如果是-1或者1,要把1省略不写,最后常数项例外

                cout << iFab;

            if(exp == 0) // 如果是常数项,直接输出绝对值

                cout << iFab;

            // 然后,输出x^和指数

            if(exp > 1)

                cout << "x^" << exp;

            else if(exp == 1)

                cout << "x";

        } // for循环

        if(first) // 如果全部都是0

            cout << "0";

        cout << endl;

    } // while循环

    return 0;

}

运行结果:

五、C语言程序:AC

#include <stdio.h>

int main() {
    int arr[10], i, first, iFab, exp;
    
    while(scanf("%d", &arr[0]) != EOF) {
        first = 1;
        for(i = 1; i < 9; i++)
            scanf("%d", &arr[i]);
        for(i = 0; i < 9; i++) {
            if(arr[i] == 0)
                continue;
            if(first) {
                if(arr[i] < 0)
                    printf("-");
                first = 0;
            }
            else
            {
                if(arr[i] < 0)
                    printf(" - ");
                else
                    printf(" + ");
            }
            if(arr[i] < 0)
                iFab = -arr[i];
            else
                iFab = arr[i];
            exp = 8 - i;
            if(iFab != 1 && exp >= 1)
                printf("%d", iFab);
            if(exp == 0)
                printf("%d", iFab);
            if(exp > 1) {
                printf("x^");
                printf("%d", exp);
            }
            else if(exp == 1)
                printf("x");
        }
        if(first)
            printf("0");
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/chuanzhouxiao/article/details/85610598