Lazy Math Instructor

本文介绍了一种通过随机数值代入的方法来判断两个算术表达式是否等价的算法。该方法首先对算式中的变量进行编号并赋随机值,接着通过递归方式计算每个表达式的值,最后比较两者是否相等。算法使用了层次结构来处理运算符的优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析算式基本不可能了,因为想要用程序将一个算式化成最简形式是比较复杂的,因此考虑使用特殊数代入的方式,那么问题就归结为如何计算一个算式,首先需要把变量编号并赋予变量随机值,然后分治计算算式。将算式分段的位置就在于符号优先级最小的最右边的符号,整个计算过程是一个层次结构,首先进行优先级最高的,再进行优先级次高的。使用记录括号层次的方法计算符号的优先级。

#include<iostream>

#include<stdlib.h>

#include<string>

using namespace std;

char equ[2][100];

int tag[26];

int id[26];

int rval[26];

int num;

int caculate(char* str,int b,int e){

int layer=0;

int opm=9999;

int i,k;

int posi = 0;

int numop = 0;

int num[2];

for(i=b;i<=e;i++){

if(str[i] == '(' ){

layer++;continue;

}

if(str[i] == ')'){

layer--;continue;

}

if(str[i]=='*'&& opm >= 3*layer + 2){opm = 3*layer + 2;posi = i;}

if(str[i]=='-'&& opm >= 3*layer + 1){opm = 3*layer + 1;posi = i;}

if(str[i]=='+'&& opm >= 3*layer){opm = 3*layer;posi = i;}

if(str[i]=='*'||str[i]=='-'||str[i]=='+') numop++;

}

if(numop == 1){

for(i=b,k=0;i<=e&&k<2;i++){

if(str[i] >='a'&& str[i]<='z'){

num[k++] = rval[id[str[i]-'a']];

}else if(str[i]>='0' && str[i]<='9'){

num[k++] = str[i]-'0';

}else{

posi = i;

}

}

switch(str[posi]){

case '*': return num[0]*num[1];

case '-': return num[0]-num[1];

case '+': return num[0]+num[1];

}

}else if(numop == 0){

for(i=b;i<=e;i++){

if(str[i] >='a'&& str[i]<='z'){

return rval[id[str[i]-'a']];

}else if(str[i]>='0' && str[i]<='9'){

return str[i]-'0';

}

}

}else{

num[0] = caculate(str,b,posi-1);

num[1] = caculate(str,posi+1,e);

switch(str[posi]){

case '*': return num[0]*num[1];

case '-': return num[0]-num[1];

case '+': return num[0]+num[1];

}

}

}

bool isequal(){

int i;

for(i=0;i<num;i++)

rval[i] = rand();

return caculate(equ[0],0,strlen(equ[0])-1) == caculate(equ[1],0,strlen(equ[1])-1);

 

}

int main(){

int t,j,k;

int i;

char str[100];

cin >> t;

cin.getline(str,100);

while(t--){

num =0;

for(i=0;i<26;i++){

tag[i] = 0;

}

for(i=0;i<2;i++){

cin.getline(str,100);

for(j=0,k=0;j<strlen(str);j++){

if(str[j] == ' ') continue;

if(str[j]>='A'&&str[j]<='Z'){

str[j] = str[j] - 'A' + 'a';

}

if(str[j]>='a' && str[j] <='z'){

if(!tag[str[j]-'a']) tag[str[j]-'a'] = 1;

}

equ[i][k++] = str[j];

}

equ[i][k] = '/0';

}

for(i=0;i<26;i++){

if(tag[i]) id[i] = num++;

}

if(isequal()) cout<< "YES" << endl;

else cout << "NO" <<endl;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值