题目:合并一个多项式中的同类项,纯数字项不用管,最后按次幂顺序输出结果, 比如
3x^3+2x^2+15-2x^3-23x^1+15
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++啊,终于看到你的冰山一角了。
终于把这个题目给弄出来了,感觉写的超级难受啊,没写过这样的代码,最近一个月得每天来个几题才行。