[c/c++练习系列]多项式合并问题

题目:合并一个多项式中的同类项,纯数字项不用管,最后按次幂顺序输出结果,    比如
3x^3+2x^2+15-2x^3-23x^1+15

输出 类似这种 按顺序输出的格式  1,-23    2,2   3,1

主要是学习c/c++的编程基础,同时熟练地利用其解决问题,这个题目我自己做了c和c++两个版本,发现c++的写起来太简单了,比c要简单很多。

c版:(写的比如龊,求拍砖,求指导)

#include<stdio.h>
#include<stdlib.h>
#include <stdbool.h> //bool

int decodeString(char *pString, int coef[], int exp[]){
    int i = 0, j = 0, k = 0;//i=>pString,j=>coef,k=>exp
    int xpos = 0;//记录找到的x的位置
    int xflag = false;//标记某个多项式中是否存在x,以便排除中间有纯数字的项
    int sum = 0;//系数
    int n = 0;
    int start = 0;//每一个多项式的开始位置,从符号后的位开始算起
    bool flag = false;//找到x的标志
    int tcoef[100], texp[100];

    //处理第一个多项式
    //处理完后i进入到第一个x的位置
    while(pString[i] != '\0' && flag == false){
        if(pString[i] == 'x'){//考虑第一项是数字?
            xpos = i;
            flag = true;
            break;
        }
        i++;
    }
    if(flag == false){
        return 0;
    }

    //若为负数,start位置不一样
    if(pString[0] == '-'){
        start = 1;
    }else{
        start = 0;
    }
    //处理系数
    for(n = start; n != xpos; n++){
        sum = sum * 10 + pString[n] - '0';
    }
    if(start == n){//系数绝对值为1
        sum = 1;
    }

    tcoef[j++] = pString[0] == '-' ? sum * (-1) : sum;
    texp[k++] = pString[i+2] - '0';
    i += 3;//直接进入第二个多项式的符号位



    //处理第一项剩余部分
    flag = false;
    sum = 0;
    i++;
    while(pString[i] != '\0'){
        //先找到下一个符号之前的多项式里面是否有x,有则可以进行处理,没有直接进入下一个多项式
        start = i;
        while(pString[i] != '\0' && flag == false){
            if(pString[i] == '+' || pString[i] == '-'){
                xpos = i;
                flag = true;
                break;
            }
            if(pString[i] == 'x'){
                xflag = true;
            }
            i++;
        }

        if(xflag == true){//不是纯数字的多项式
            //处理多项式,获取系数以及次幂
            for(n = start; pString[n] != 'x'; n++){
                sum = sum * 10 + pString[n] - '0';
            }
            if(start == n){//系数为1或者-1时单独处理
                sum = 1;
            }
            tcoef[j++] = pString[start-1] == '-' ? sum * (-1) : sum;
            texp[k++] = pString[xpos-1] - '0';
        }
        i++;
        flag = false;
        xflag = false;
        sum = 0;
    }

    //处理完后对多项式的系数和进行汇总
    //1.先对次幂进行排序
    //2.对相同的次幂求和,移动位置,然后放入到新的参数数组中
    //示例
    //-1 2 3 -5 -8 -4
    //3  2  1 3  4  2
    //结果
    //-8 -6 -2 3
    // 4  3  2 1

    sum = 0;//作为记录到参数数组时的下标
    for(i = 0; i < j; i++){
        if(tcoef[i] != 0){
            for(n = i + 1; n < j; n++){
                if(texp[n] == texp[i]){
                    //sum作为exp交换临时变量
                    //xpos作为coef交换临时变量
                    tcoef[i] = tcoef[i] + tcoef[n];
                    tcoef[n] = 0;
                    texp[n] = 0;
                }
            }
            //将处理好后的元素转移到参数数组中
            coef[sum] = tcoef[i];
            exp[sum] = texp[i];
            sum++;
        }
    }


    //接着排序,注意系数与次幂的对应关系
    start = 0;
    xpos = 0;
    for(i = 0; i < sum - 1; i++){
        for(n = i + 1; n < sum; n++){
            if(exp[n] > exp[i]){
                //start作为exp交换临时变量
                //xpos作为coef交换临时变量
                start = exp[i];
                xpos = coef[i];
                exp[i] = exp[n];
                coef[i] = coef[n];
                exp[n] = start;
                coef[n] = xpos;
            }
        }
    }

    //输出
    for(i = 0; i < sum; i++){
        printf("%d ", coef[i]);
    }
    printf("\r\n");
    for(i = 0; i < sum; i++){
        printf("%d ", exp[i]);
    }

	return 1;
}


int main()
{
    char pString[100];
    int coef[100], exp[100];
	scanf("%s", pString);
	decodeString(pString, coef, exp);
	system("PAUSE");
	return 0;

}

c++版:

#include <iostream>
#include <cstdlib>
#include <map>
using namespace std;

int main()
{
    //合并多项式,输出次幂与系数的对应
    //比如3x^3+2x^2+15-2x^3-23x^1+15,输出
    //1,-23  2,2  3, 1

    //主要熟悉
    //1.对string的一些函数的使用,包括substr,find,以及对字符串直接转换为数字的用法(c函数atoi以及其参数)
    //2.对map的用法,包括对相同键的合并操作

    string s;
    map<int, int> polymap;
    size_t iter = 0, polystart = 0;
    size_t minuspos, pluspos, nextoperpos, xpos;
    int coefsum = 0, expsum = 0;
    //1.先找start
    //2.寻找下一个+,-
    //3.在start位置开始,+之前找到x;x之后的第二个位置到+之前的位置是次幂
    //4.从start开始到x之前的位置就是系数
    //5.存入map中
    //6.移动start为下一个+,-处,重复2-5
    cin >> s;
    while(iter != s.size()){
        pluspos = s.find('+',polystart+1);//当前的+,-肯定要排除
        minuspos = s.find('-', polystart+1);
        if(pluspos > s.size() && minuspos > s.size()){
        //只有同时都大于size才表明已经是最后一项!
            pluspos = minuspos = s.size();
        }
        nextoperpos = pluspos > minuspos ? minuspos : pluspos;//判断离polystart最近的操作符
        xpos = s.find('x', polystart);

        if(xpos < nextoperpos){//表明多项式不是数字
            //处理系数
            if(xpos - polystart <= 1){//系数为1或者-1或者是0-9数字
               coefsum = (s[polystart] == '+' || s[polystart] == 'x' || s[polystart] == '-') ?
                         ((s[polystart] == '+' || s[polystart] == 'x') ? 1 : -1) : (s[polystart] - '0');
            }else{//截取系数
                //先截取,然后转换成数字
               coefsum = atoi(s.substr(polystart, xpos-polystart).c_str());
            }
            //处理次幂
            expsum = atoi(s.substr(xpos+2, nextoperpos-xpos-2).c_str());
			//插入到map中
			auto  ret = polymap.insert(make_pair(expsum, coefsum));
			if(!ret.second){//表明expsum已经在map中,也就是说有多个相同次幂的多项式,这里作整合
				ret.first->second += coefsum;
			}
        }
        polystart = nextoperpos;//无论是纯数字的还是非纯数字的,最后都要经过这一步下移开始位的操作
        iter = nextoperpos;
    }

    for(const auto &poly : polymap){
        cout << "exp: " << poly.first << " coef:" << poly.second <<endl;
    }
    system("PAUSE");
    return 0;
}
感觉c++的看上去舒服了很多,所以还得好好学c++啊,终于看到你的冰山一角了。


终于把这个题目给弄出来了,感觉写的超级难受啊,没写过这样的代码,最近一个月得每天来个几题才行。

你可能感兴趣的:(编程,C++,c,算法,机试)