Wednesday, December 19, 2018

算法题-合并同类项

题目描述

利用指针实现如下函数功能:
int polycomb(char s1, char s2, char *buffer)
函数功能为:将s1,s2指向的多项式合并同类项后,存入buffer指向的变量中,函数返回为合并同类项后最高次的系数。在主函数中输出合并后的多项式,以及其最高次的系数。
说明:多项式均按照降次排列,且输入的多项式的系数均为一位整数,系数为零的项不显示。

输入

输入两行,分别为两个多项式,多项式按照降次排列,输入数据中每项系数均为一位且不为0

输出

输出合并之后的多项式,以及其最高次的系数,多项式按降次排列,且系数为0的项不显示

样例输入

x^3+2x^2-5x+6
-2x^2-2x

样例输出

x^3-7x+6 1

我写的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <string.h>

int ans[1024];

void clac(char *s) {
    /* -x^3+2x^2-5x+6 
     * -2x^2-2x 
     * ax^b 
     */

    int a = 0, b;

    for (int i = 0; i < strlen(s); ++i) {
        char c = s[i];

        if (c == '+') {
            ans[0] += a;
            a = 1;
        } else if (c == '-') {
            ans[0] += a;
            a = -1;
        } else if (c > '0' && c <= '9') {
            int k = (c - '0');
            for (; (c = s[i+1]) && c >= '0' && c <= '9'; ++i) {
                k = 10*k + (c - '0');
            }
            if (!a)
                a = 1;
            a *= k;
        } else if (c == 'x') {
            if (i == 0) {
                a = 1;
            }

            c = s[i+1];
            if (c == '^') {
                b = s[i += 2] - '0';
                for (; (c = s[i+1]) && c >= '0' && c <= '9'; ++i) {
                    b = 10*b + (c - '0');
                }
            } else {
                b = 1;
            }

            /* printf("%d %d\n", a, b); */
            ans[b] += a;
            a = 0;
        }
    }

    /* printf("%d %d\n", ans[0], a); */
    ans[0] += a;
}

int main() {
    char s1[1024], s2[1024];

    scanf("%s%s", s1, s2);

    memset(ans, 0, sizeof(ans));
    
    clac(s1);
    clac(s2);

    int begin = 1, max;

    for (int i = 1023; i > 0; --i) {
        if (!ans[i])
            continue;
        /*
         * [+-] ax^b
         */
        if (begin) {
            max = ans[i];
        } else {
            if (ans[i] > 0) {
                printf("+");
            }
        }


        if (ans[i] == -1) {
            printf("-");
        } else if (ans[i] != 1) {
            printf("%d", ans[i]);
        }

        printf("x");

        if (i != 1) {
            printf("^%d", i);
        }

        begin = 0;
    }

    if (!begin && ans[0] > 0)
        printf("+");
    if (ans[0]) {
        printf("%d", ans[0]);
        if (begin)
            max = ans[0];
    }

    printf(" %d", max);

    return 0;
}

// vim: et:ts=4:sw=4:

0 comments:

Post a Comment