一元单项式输入和输出(灵活格式)

从一行输入的字符串里,读取其中的单项式,并按照要求的格式输出(输出时,每行一个)。单项式的基本格式为:

系数x^幂指数

例如:

5x^2 表示5倍的 x 平方
3x^-4 表示3倍的 x 的 -4 次方

输入要求

1)当省略系数,则表示系数为 1。例如:x^3
2)当系数省略为减号时,则表示系数为 -1。例如:-x^3
3)当省略幂指数时,则表示幂指数为1。例如:-5x。
4)对于常数项,可以省略x^0,例如:-2 表示 -2x^0
5)输入时,一个单项式内部【不允许】有空白字符(空格或\t)。例如:2  x^    3

输出要求

1)如果幂指数为0,则简化为常数项。例如:-3 x ^ 0 应该输出为 -3
2)如果幂指数为 1,则须省略它。例如:-3x^1 应该输出为-3x
3)如果系数为1或-1,则输出时须省略1。例如:-x^6,x^2
4)输出时,单项式内部不能有空白字符(空格或\t)

函数接口定义:

----------------------------------------------------------------------------------------
函数 InputMonomial - 读入字符串中的第一个单项式
char* InputMonomial(char *s, PolynomialNode *p );
    参数 
        s - 字符串指针,从中读取数据
        p - 单项式结构指针,保存读取结果
    返回值是一个字符串指针
        成功 - 指向字符串 s 中未被处理的第一个字符(包括\0)
        失败 - NULL
----------------------------------------------------------------------------------------
函数 OutputMonomial - 以精简格式输出单项式(系数为coef,幂指数为expo)
void OutputMonomial(int coef, int expo); 
    参数
         coef - 单项式的系数
         expo - 单项式的幂指数
    返回值 
        无 
----------------------------------------------------------------------------------------

裁判测试程序样例:

#include <stdio.h>

#define MAXLINE 1024

typedef struct PolynomialStruct{
    int coef; // 系数
    int expo;  // 幂次
    struct PolynomialStruct * next;
} PolynomialNode;

//判断字符串 s 的起始字符是否为:x^ 或 X^
int IsEXP(char *s)
{
    return ( (s[0]=='x' || s[0]=='X') && s[1]=='^');
}

//字符是否为\n或\0
int IsEndingChar(char ch)
{
    return (ch==0 || ch=='\n');
}

//跳过字符串起始部分的空格和制表符
//返回值:一个指针
//      指向字符串前面的第一个非空白字符
char * SkipSpaceChars(char *s)
{
    while( *s==' ' || *s=='\t' )
        s++;
    return s;
}

char* InputMonomial(char *s, PolynomialNode *p );
void OutputMonomial(int coef, int expo); 

int main()
{
    char linebuffer[MAXLINE], *p;
    PolynomialNode node;

    p = fgets(linebuffer, sizeof(linebuffer), stdin);
    while( p = InputMonomial(p, &node) ) {
        OutputMonomial(node.coef, node.expo);
        printf("\n");
    }

    return 0;
}
/* 请在这里填写答案 */

输入样例:

-3x^-6    x^5   3x    1   3x^0   -1x    x^0

输出样例:

对应上面的每一行输入,输出结果分别是:

-3x^-6
x^5
3x
1
3
-x
1

char* InputMonomial(char *s, PolynomialNode *p ){
    if(IsEndingChar(*s))return NULL;
    int m;
    if(IsEXP(s))p->coef = 1;
    else{
        if(*s=='-'&&IsEXP(s+1)){
            p->coef = -1;
            s = s + 1;
        }else{
            sscanf(s,"%d%n",&(p->coef),&m);
            s = s+m;
        }
    }
    if(*s=='x'){
        s++;
        if(*s!='^'){
            p->expo = 1;
            s = s++;
        }
        else {
            s++;
            sscanf(s,"%d%n",&(p->expo),&m);
            s = s+m;
        }
    }
    else p->expo = 0;
    s = SkipSpaceChars(s);
    return s;
}
void OutputMonomial(int coef, int expo){
    if(expo==1){
        if(coef!=1&&coef!=-1)printf("%dx",coef);
        else if(coef==1)printf("x");
        else printf("-x");
    }
    else if(expo==0)printf("%d",coef);
    else if(coef==1)printf("x^%d",expo);
    else if(coef==-1){
        printf("-x^%d",expo);
    }
    else printf("%dx^%d",coef,expo);
}