字符串专题之计算表达式
1这种表达式的计算就是先计算乘除再计算加减(加减放到最后都转换为加法)
放到栈里面 ,加法变成减法比较方便
/*
二十四点
来源:CCF
标签:
参考资料:
相似题目:
背景
二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。
题目
定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加法用符号 + 表示,减法用符号 - 表示,乘法用小写字母 x 表示,除法用符号 / 表示。在游戏里除法为整除,例如 2 / 3 = 0,3 / 2 = 1, 4 / 2 = 2。
老师给了你 n 个游戏的解,请你编写程序验证每个游戏的结果是否为 24 。
输入
从标准输入读入数据。第一行输入一个整数 n,从第 2 行开始到第 n + 1 行中,每一行包含一个长度为 7的字符串,为上述的 24 点游戏,保证数据格式合法。
输出
输出到标准输出。
包含 n 行,对于每一个游戏,如果其结果为 24 则输出字符串 Yes,否则输出字符串 No。
输入样例
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
输出样例
Yes
No
No
Yes
Yes
No
No
No
Yes
Yes
样例解释
9+3+4 × 3 = 24
5+4 × 5 × 5 = 105
7 − 9 − 9+8= −3
5 × 6/5 × 4 = 24
3 + 5 + 7 + 9 = 24
1 × 1+9 − 9=1
1 × 9 − 5/9 = 9
8/5 + 6 × 9 = 55
6 × 7 − 3 × 6 = 24
6 × 4 + 4/5 = 24
*/
//这种表达式的计算就是先计算乘除再计算加减(加减放到最后都转换为加法)
//放到栈里面 ,加法变成减法比较方便
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
int n;
char str[10];
stack<int> num;
stack<char> sign;
int main()
{
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{
gets(str);
while(!num.empty()) num.pop();//别忘了清空栈
while(!sign.empty()) sign.pop();
int j=0;
while(j<strlen(str))
{
if(str[j]>'0'&&str[j]<='9') num.push(str[j]-'0');
else
{
if(str[j]=='+') sign.push('+');
else if(str[j]=='-')
{
num.push((str[j+1]-'0')*(-1));
sign.push('+');
j++;
}
else if(str[j]=='x')
{
int lhs=num.top();
num.pop();
num.push(lhs*(str[j+1]-'0'));
j++;
}
else if(str[j]=='/')
{
int lhs=num.top();
num.pop();
num.push(lhs/(str[j+1]-'0'));
j++;
}
}
}
}
while(!sign.empty())
{
int rhs=num.top();
num.pop();
int lhs=num.top();
sign.pop();
num.push(lhs+rhs);
}
int ans=num.top();
if(ans==24) printf("Yes\n");
else printf("No\n");
return 0;
}
字符串专题之string的超时!!!!!,我队友写的求模大法好
/*
L1-6 同构数 (15分)
小明很喜欢研究数字规律,他发现有一些数值平方后会有一种奇怪的现象,他把会出现这种现象的数叫“同构数”。“同构数”是指这样的一种数,会出现在它的平方的右端的数。例如,5是25右边的数,25是625右边的数,5和25都是同构数。小明觉得这些数并不止一两个,现给定正整数m和n,请帮他找出m和n之间(包括m和n)全部同构数。
输入格式:
输入只有1行.包含两个正整数m,n(m<n)。
输出格式:
按照递增的顺序输出m和n之间的全部同构数。相邻两个数之间用空格分开,行末不能有多余空格。
输入样例:
1 20
输出样例:
1 5 6
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10010;
const int INF = 0x3fffffff;
const double PI = acos(-1);
vector<ll>v;
int main(){
ll m, n, ans = 0;
scanf("%lld%lld", &m, &n);
for(ll i = m; i <= n; i++){
ll t = i % 10;
if(t != 1 && t != 5 && t != 6) continue;
t = i * i;
ll k = (int)log10(i) + 1;
if(t % (int)pow(10,k) == i) v.push_back(i);
}
for(auto i = v.begin(); i != v.end(); i++)
printf("%s%d", i == v.begin() ? "" : " ", *i);
return 0;
}