开个贴记录一下自己写过的代码,苦逼大三csp想考300
题目
一、思路
1.切割“=”左右,用String字符串来保存等式左右;
2.同样步骤对“+”切割,计算每个元素的出现次数;
切割示例代码
vector<string> split(string s){
vector<string> data;
int num=0,count=0;
for(int i=0;i<s.size();i++){
if(s[i]=='+'){ //此处是对'+'切割,若要对'='切割,只需替换
data.push_back(s.substr(num,count));
num=i+1;
count=0;
}else{
count++;
}
}
data.push_back(s.substr(num,count));
return data;
}
3.对各个元素进行元素统计,先取出系数值,保存为beishu,之后每个元素个数都乘上倍数;
4.从后往前遍历,记录元素个数,碰到括号就将倍数入栈或出栈;
5.将所有元素分别保存在两个map中,最后对比map的值,输出Y or N;
元素统计代码
void my_count1(string s){
int beishu,beishu2=1;
string s1="";
int num=0;
stack<int> bei; //碰到括号才用的栈,记录了倍数
while(s[num]-'0'>=0&&s[num]-'0'<=9){
num++;
} //寻找系数
if(num!=0){
s1=s.substr(0,num);
beishu=to_int(s1);
}else beishu=1;
s1="";
int x=1;
int flag=0;
int length=s.size();
for(int i=length-1;i>=num;i--){ //倒序匹配
if(flag==1){
flag=0; //用来跳过特殊情况
continue;
}
if(s[i]==')'){
bei.push(x);
beishu2=x*beishu2;
x=1;
}else if(s[i]=='('){
beishu2=beishu2/bei.top(); //碰见正括号需要将beishu还原到之前的状态
bei.pop();
}
if(s[i]-'0'>=0&&s[i]-'0'<=9){
s1=s.substr(i,1)+s1;
if(s[i-1]-'0'<0&&s[i-1]>9){
x=to_int(s1);
s1="";
}else{
x=to_int(s1);
}
}
if(s[i]-'a'>=0&&s[i]-'a'<=26){
s1=s.substr(i-1,2);
if(mp1.count(s1)==0){
mp1[s1]=beishu*x*beishu2;
}else{
mp1[s1]=mp1[s1]+beishu*x*beishu2;
}
s1="";
flag=1; //特殊情况
x=1;
}
if(s[i]-'A'>=0&&s[i]-'A'<=26){
s1=s.substr(i,1);
if(mp1.count(s1)==0){
mp1[s1]=beishu*x*beishu2;
}else{
mp1[s1]=mp1[s1]+beishu*x*beishu2;
}
s1="";
x=1;
}
}
}
map对比代码
void compare(string s1,string s2){
vector<string> data1,data2;
data1=split(s1);
data2=split(s2);
for(int i=0;i<data1.size();i++){
my_count1(data1[i]);
}
for(int i=0;i<data2.size();i++){
my_count2(data2[i]);
}
if(mp1.size()!=mp2.size()){
cout<<"N"<<endl;
mp1.clear(); //在做完一次对比后一定记得清除map,不然后序检验无法正常进行
mp2.clear();
return;
}
for(map<string,ll>::iterator it=mp1.begin();it!=mp1.end();it++){
if(it->second!=(mp2[it->first])){
cout<<"N"<<endl;
mp1.clear();
mp2.clear();
return;
}
}
cout<<"Y"<<endl;
mp1.clear();
mp2.clear();
return;
}
二、全部代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,ll> mp1,mp2;
int to_int(string s){
int num=0;
int wei=1;
for(int i=s.size()-1;i>=0;i--){
num+=(s[i]-'0')*wei;
wei*=10;
}
return num;
}
void my_count1(string s){
int beishu,beishu2=1;
string s1="";
int num=0;
stack<int> bei;
while(s[num]-'0'>=0&&s[num]-'0'<=9){
num++;
}
if(num!=0){
s1=s.substr(0,num);
beishu=to_int(s1);
}else beishu=1;
s1="";
int x=1;
int flag=0;
int length=s.size();
for(int i=length-1;i>=num;i--){
if(flag==1){
flag=0;
continue;
}
if(s[i]==')'){
bei.push(x);
beishu2=x*beishu2;
x=1;
}else if(s[i]=='('){
beishu2=beishu2/bei.top();
bei.pop();
}
if(s[i]-'0'>=0&&s[i]-'0'<=9){
s1=s.substr(i,1)+s1;
if(s[i-1]-'0'<0&&s[i-1]>9){
x=to_int(s1);
s1="";
}else{
x=to_int(s1);
}
}
if(s[i]-'a'>=0&&s[i]-'a'<=26){
s1=s.substr(i-1,2);
if(mp1.count(s1)==0){
mp1[s1]=beishu*x*beishu2;
}else{
mp1[s1]=mp1[s1]+beishu*x*beishu2;
}
s1="";
flag=1;
x=1;
}
if(s[i]-'A'>=0&&s[i]-'A'<=26){
s1=s.substr(i,1);
if(mp1.count(s1)==0){
mp1[s1]=beishu*x*beishu2;
}else{
mp1[s1]=mp1[s1]+beishu*x*beishu2;
}
s1="";
x=1;
}
}
}
void my_count2(string s){
int beishu,beishu2=1;
string s1="";
int num=0;
stack<int> bei;
while(s[num]-'0'>=0&&s[num]-'0'<=9){
num++;
}
if(num!=0){
s1=s.substr(0,num);
beishu=to_int(s1);
}else beishu=1;
s1="";
int x=1;
int flag=0;
int length=s.size();
for(int i=length-1;i>=num;i--){
if(flag==1){
flag=0;
continue;
}
if(s[i]==')'){
bei.push(x);
beishu2=x*beishu2;
x=1;
}else if(s[i]=='('){
beishu2=beishu2/bei.top();
bei.pop();
}
if(s[i]-'0'>=0&&s[i]-'0'<=9){
s1=s.substr(i,1)+s1;
if(s[i-1]-'0'<0&&s[i-1]>9){
x=to_int(s1);
s1="";
}else{
x=to_int(s1);
}
}
if(s[i]-'a'>=0&&s[i]-'a'<=26){
s1=s.substr(i-1,2);
if(mp2.count(s1)==0){
mp2[s1]=beishu*x*beishu2;
}else{
mp2[s1]=mp2[s1]+beishu*x*beishu2;
}
s1="";
flag=1;
x=1;
}
if(s[i]-'A'>=0&&s[i]-'A'<=26){
s1=s.substr(i,1);
if(mp2.count(s1)==0){
mp2[s1]=beishu*x*beishu2;
}else{
mp2[s1]=mp2[s1]+beishu*x*beishu2;
}
s1="";
x=1;
}
}
}
vector<string> split(string s){
vector<string> data;
int num=0,count=0;
for(int i=0;i<s.size();i++){
if(s[i]=='+'){
data.push_back(s.substr(num,count));
num=i+1;
count=0;
}else{
count++;
}
}
data.push_back(s.substr(num,count));
return data;
}
void compare(string s1,string s2){
vector<string> data1,data2;
data1=split(s1);
data2=split(s2);
for(int i=0;i<data1.size();i++){
my_count1(data1[i]);
}
for(int i=0;i<data2.size();i++){
my_count2(data2[i]);
}
if(mp1.size()!=mp2.size()){
cout<<"N"<<endl;
mp1.clear();
mp2.clear();
return;
}
for(map<string,ll>::iterator it=mp1.begin();it!=mp1.end();it++){
if(it->second!=(mp2[it->first])){
cout<<"N"<<endl;
mp1.clear();
mp2.clear();
return;
}
}
cout<<"Y"<<endl;
mp1.clear();
mp2.clear();
return;
}
int main(){
int n;
cin>>n;
string s,s1,s2;
for(int i=0;i<n;i++){
cin>>s;
for(int j=0;j<s.size();j++){
if(s[j]=='='){
s1=s.substr(0,j);
s2=s.substr(j+1,s.size()-j-1);
compare(s1,s2);
}
}
}
return 0;
}
总结
1.本题较简单,只是简单的方程式配平,需要极强的耐心;
2.在写题过程中多尝试使用cout输出检测函数块功能是否如预期正常运转;