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

来源:互联网 发布:扎克伯格老婆知乎 编辑:程序博客网 时间:2024/05/16 05:18
题目:合并一个多项式中的同类项,纯数字项不用管,最后按次幂顺序输出结果,    比如
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> //boolint 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++啊,终于看到你的冰山一角了。


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

0 0
原创粉丝点击