题意:
一个只有加法和乘法,且数字都是个位数的式子A(length <= 17),一个答案B(0 <= B <= 999999999)。
有两种计算方法:
1.以乘法优先的顺序计算,得E。
2.从左至右依次计算,得F。
若 只是 E = B,输出M;
若 只是 F = B, 输出L;
若E = F = B,输出U;
若E,F都不等于B,输出I。
做法:
对于两种计算方法:
1.用两个数组分别保存数字和运算符。数字数组空位置为0,运算符数组空位置置为空格。
2.从左往右直接计算。
最后,比较二者的结果即可。
反省:
计算方法一,注意乘法结果的处理,因为可能有连乘的情况…2*3*4…。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int
main() {
// freopen("in.txt","r",stdin);
char s[20];
char f[20];
int a[20],n,first,second;
while(scanf("%s%d",s,&n)!=EOF)
{
// for(int i=0;i<strlen(s);i++)
// printf("%c",s[i]);
getchar();
memset(f,' ',sizeof(f));
memset(a,0,sizeof(a));
int l=strlen(s);
int ff=2,aa=1;
first=0;
second=s[0]-'0';
for(int i=0;i<l;i++)
{
if(s[i]=='*'||s[i]=='+')
{
f[ff]=s[i];
ff+=2;
}
else
{
a[aa]=s[i]-'0';
aa+=2;
}
}
ff-=2;
aa-=2;
int i=1;
while(1)
{
if(s[i]=='*')
{
second*=s[i+1]-'0';
i+=2;
}
if(s[i]=='+')
{
second+=s[i+1]-'0';
i+=2;
}
if(i==l)break;
}
for(int i=2;i<=ff;i+=2)
{
if(f[i]=='+')continue;
else
{
a[i+1]=a[i-1]*a[i+1];
a[i-1]=0;
}
}
for(int i=0;i<=aa;i++)
first+=a[i];
// for(int i=0;i<=ff;i++)
// printf("%c",f[i]);
// cout<<endl;
// for(int i=0;i<=aa;i++)
// cout<<a[i];
// cout<<endl;
// cout<<first<<endl;
// cout<<second<<endl;
if(n==first&&n!=second)printf("M\n");
else if(n!=first&&n==second)printf("L\n");
else if(n==first&&n==second)printf("U\n");
else if(n!=first&&n!=second)printf("I\n");
}
return 0;
}
本文介绍了一种算法,用于解析包含加法和乘法运算的简单数学表达式,并通过两种不同的计算顺序得出结果,最终根据这些结果与给定答案进行对比,以确定计算方式是否正确。
3万+

被折叠的 条评论
为什么被折叠?



