输出 类似这种 按顺序输出的格式 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; }
#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++啊,终于看到你的冰山一角了。
终于把这个题目给弄出来了,感觉写的超级难受啊,没写过这样的代码,最近一个月得每天来个几题才行。