计算器的改良(NOIP2000) 是DEV C++ 4.9.9.2
发布网友
发布时间:2022-04-24 05:23
我来回答
共1个回答
热心网友
时间:2023-10-31 13:23
我自己写了一个,很好理解,但是输入输出是我自己写的,你可以改成文件
#include<iostream>
#include<iomanip>
using namespace std;
void fun(char* str){
char uknum;
for(int i=0; i<(int)strlen(str); i++)
if(str[i]>='a' &&str[i]<='z'){
uknum = str[i];
break;
}
int equalpos=0;
for(int i=0; i<(int)strlen(str); i++)
if(str[i]=='=') equalpos = i;
int co = 0;
for(int i=0; i<(int)strlen(str); i++){ //处理未知数项
int tmpco = 0;
if(str[i]>='a' &&str[i]<='z'){
if(i<equalpos){
if(i==0 || str[i-1]=='+')tmpco=1;
else{
if(str[i-1] == '-')tmpco=-1;
else{
char* tmp = str+i-1;
while(*tmp != '+' && *tmp != '-' && tmp > str)tmp--;
if(*tmp == '-'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0-tmpco;
}else{
if(*tmp == '+'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}else{
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}
}
}
}
}
else{
if(str[i-1]=='+' || str[i-1]=='=')tmpco=-1;
else{
if(str[i-1] == '-')tmpco=1;
else{
char* tmp = str+i-1;
while(*tmp != '+' && *tmp != '-' && *tmp != '=')tmp--;
if(*tmp == '-'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}else{
if(*tmp == '+'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0 - tmpco;
}else{
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0 - tmpco;
}
}
}
}
}
}
co+=tmpco;
}
int coint = 0;
for(int i=0; i<(int)strlen(str); i++){ //处理其余项
int tmpcoint = 0;
if(str[i]>='0' && str[i]<='9'){
if(i<equalpos){
char* tmpint = str+i;
while(*tmpint>='0'&&*tmpint<='9'){
tmpcoint = tmpcoint*10 + *tmpint-48;
tmpint++;
}
if(*tmpint==uknum){
i = tmpint-str;
continue;
}
else{
if(i==0 ||str[i-1]=='+'){coint-=tmpcoint;i = tmpint -str;}
else{
coint +=tmpcoint;
i = tmpint -str;
}
}
}
else{
char* tmpint = str+i;
while(*tmpint>='0'&&*tmpint<='9'){
tmpcoint = tmpcoint*10 + *tmpint-48;
tmpint++;
}
if(*tmpint==uknum){
i = tmpint-str;
continue;
}
else{
if(str[i-1]=='=' ||str[i-1]=='+'){coint+=tmpcoint;i=tmpint-str;}
else{
coint -=tmpcoint;
i = tmpint - str;
}
}
}
}
}
cout<<uknum<<" = "<<fixed<<setprecision(3)<<double(coint)/double(co)<<endl;
}
int main(){
char* str = "4+3x=8";
fun(str);
return 0;
}追问有点复杂,可以说算法么
追答不是复杂,有点多。。比如说吧6a-5+1=2-2a
第一个for循环是找未知数的,这里是a,我程序里用uknum,然后计算未知数系数,把含有a的项移到等式左边,系数存在co里
第二个for循环是计算剩余值,移到等式右边,存在coint里
最后用coint/co计算未知数的值
热心网友
时间:2023-10-31 13:23
我自己写了一个,很好理解,但是输入输出是我自己写的,你可以改成文件
#include<iostream>
#include<iomanip>
using namespace std;
void fun(char* str){
char uknum;
for(int i=0; i<(int)strlen(str); i++)
if(str[i]>='a' &&str[i]<='z'){
uknum = str[i];
break;
}
int equalpos=0;
for(int i=0; i<(int)strlen(str); i++)
if(str[i]=='=') equalpos = i;
int co = 0;
for(int i=0; i<(int)strlen(str); i++){ //处理未知数项
int tmpco = 0;
if(str[i]>='a' &&str[i]<='z'){
if(i<equalpos){
if(i==0 || str[i-1]=='+')tmpco=1;
else{
if(str[i-1] == '-')tmpco=-1;
else{
char* tmp = str+i-1;
while(*tmp != '+' && *tmp != '-' && tmp > str)tmp--;
if(*tmp == '-'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0-tmpco;
}else{
if(*tmp == '+'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}else{
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}
}
}
}
}
else{
if(str[i-1]=='+' || str[i-1]=='=')tmpco=-1;
else{
if(str[i-1] == '-')tmpco=1;
else{
char* tmp = str+i-1;
while(*tmp != '+' && *tmp != '-' && *tmp != '=')tmp--;
if(*tmp == '-'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}else{
if(*tmp == '+'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0 - tmpco;
}else{
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0 - tmpco;
}
}
}
}
}
}
co+=tmpco;
}
int coint = 0;
for(int i=0; i<(int)strlen(str); i++){ //处理其余项
int tmpcoint = 0;
if(str[i]>='0' && str[i]<='9'){
if(i<equalpos){
char* tmpint = str+i;
while(*tmpint>='0'&&*tmpint<='9'){
tmpcoint = tmpcoint*10 + *tmpint-48;
tmpint++;
}
if(*tmpint==uknum){
i = tmpint-str;
continue;
}
else{
if(i==0 ||str[i-1]=='+'){coint-=tmpcoint;i = tmpint -str;}
else{
coint +=tmpcoint;
i = tmpint -str;
}
}
}
else{
char* tmpint = str+i;
while(*tmpint>='0'&&*tmpint<='9'){
tmpcoint = tmpcoint*10 + *tmpint-48;
tmpint++;
}
if(*tmpint==uknum){
i = tmpint-str;
continue;
}
else{
if(str[i-1]=='=' ||str[i-1]=='+'){coint+=tmpcoint;i=tmpint-str;}
else{
coint -=tmpcoint;
i = tmpint - str;
}
}
}
}
}
cout<<uknum<<" = "<<fixed<<setprecision(3)<<double(coint)/double(co)<<endl;
}
int main(){
char* str = "4+3x=8";
fun(str);
return 0;
}追问有点复杂,可以说算法么
追答不是复杂,有点多。。比如说吧6a-5+1=2-2a
第一个for循环是找未知数的,这里是a,我程序里用uknum,然后计算未知数系数,把含有a的项移到等式左边,系数存在co里
第二个for循环是计算剩余值,移到等式右边,存在coint里
最后用coint/co计算未知数的值
热心网友
时间:2023-10-31 13:23
我自己写了一个,很好理解,但是输入输出是我自己写的,你可以改成文件
#include<iostream>
#include<iomanip>
using namespace std;
void fun(char* str){
char uknum;
for(int i=0; i<(int)strlen(str); i++)
if(str[i]>='a' &&str[i]<='z'){
uknum = str[i];
break;
}
int equalpos=0;
for(int i=0; i<(int)strlen(str); i++)
if(str[i]=='=') equalpos = i;
int co = 0;
for(int i=0; i<(int)strlen(str); i++){ //处理未知数项
int tmpco = 0;
if(str[i]>='a' &&str[i]<='z'){
if(i<equalpos){
if(i==0 || str[i-1]=='+')tmpco=1;
else{
if(str[i-1] == '-')tmpco=-1;
else{
char* tmp = str+i-1;
while(*tmp != '+' && *tmp != '-' && tmp > str)tmp--;
if(*tmp == '-'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0-tmpco;
}else{
if(*tmp == '+'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}else{
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}
}
}
}
}
else{
if(str[i-1]=='+' || str[i-1]=='=')tmpco=-1;
else{
if(str[i-1] == '-')tmpco=1;
else{
char* tmp = str+i-1;
while(*tmp != '+' && *tmp != '-' && *tmp != '=')tmp--;
if(*tmp == '-'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
}else{
if(*tmp == '+'){
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0 - tmpco;
}else{
tmp++;
while(tmp < str+i){
tmpco = tmpco*10 + *tmp-48;
tmp++;
}
tmpco = 0 - tmpco;
}
}
}
}
}
}
co+=tmpco;
}
int coint = 0;
for(int i=0; i<(int)strlen(str); i++){ //处理其余项
int tmpcoint = 0;
if(str[i]>='0' && str[i]<='9'){
if(i<equalpos){
char* tmpint = str+i;
while(*tmpint>='0'&&*tmpint<='9'){
tmpcoint = tmpcoint*10 + *tmpint-48;
tmpint++;
}
if(*tmpint==uknum){
i = tmpint-str;
continue;
}
else{
if(i==0 ||str[i-1]=='+'){coint-=tmpcoint;i = tmpint -str;}
else{
coint +=tmpcoint;
i = tmpint -str;
}
}
}
else{
char* tmpint = str+i;
while(*tmpint>='0'&&*tmpint<='9'){
tmpcoint = tmpcoint*10 + *tmpint-48;
tmpint++;
}
if(*tmpint==uknum){
i = tmpint-str;
continue;
}
else{
if(str[i-1]=='=' ||str[i-1]=='+'){coint+=tmpcoint;i=tmpint-str;}
else{
coint -=tmpcoint;
i = tmpint - str;
}
}
}
}
}
cout<<uknum<<" = "<<fixed<<setprecision(3)<<double(coint)/double(co)<<endl;
}
int main(){
char* str = "4+3x=8";
fun(str);
return 0;
}追问有点复杂,可以说算法么
追答不是复杂,有点多。。比如说吧6a-5+1=2-2a
第一个for循环是找未知数的,这里是a,我程序里用uknum,然后计算未知数系数,把含有a的项移到等式左边,系数存在co里
第二个for循环是计算剩余值,移到等式右边,存在coint里
最后用coint/co计算未知数的值