CCF算法笔记2 二十四点

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43269048/article/details/100057811

在这里插入图片描述
分析:题目很容易理解,我们只需要模拟四则运算即可,题目设限简单,我们只需要进行四个个位数的加减乘除运算即可,并且还不包括括号。当结果等于24时,即可输出结果“Yes”,否则输出“No”。
这道题的解题方法有很多,

  1. 首先最简单的暴力法,因为只设计到四个个个位数加减,我们只需要把所有情况都列出来即可,一共4^3=64种,这种方法空间占用比较少,因为没有涉及到STL,但是时间比较多,因为需要逐个判断。
  2. 经典的四则运算用到的栈的方法,生成两个栈,分别保存数字和符号,当遇到+、-时符号直接入栈,当遇到*、/时,先计算符号前后两个数再入栈,最后遍历数字栈,插入+、-号,通过数字出栈入栈,栈得到的最后一个数即最终结果。
    代码,穷举法的:
#include <iostream>   //头文件不需要这么多,习惯粘上所有的
#include <cstdio>
#include <set>   //自动排序, 不可重复  unordered_set
#include <sstream>    
#include <string>  //char[] , string 
#include <typeinfo>
#include <algorithm>  //sort()   cmp
#include <vector>
#include <map>   //map a;   a.insert(pair<,>,())   a[10]="qewe"; 
#include <cctype> 
#include <iomanip>   //cout<<setw(10)<<left
#include <queue>
#include <cmath>//printf("%.2f",a)
using namespace std;

int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int r=0;
		int a=0,b=0,c=0,d=0;
		string s;
		cin>>s;
		a=s[0]-'0';
		b=s[2]-'0';
		c=s[4]-'0';
		d=s[6]-'0';
		//暴力循环
		if(s[1]=='+')
			{	
				if(s[3]=='+')
					{
						if(s[5]=='+') r=a+b+c+d;
						else if(s[5]=='-') r=a+b+c-d;
						else if(s[5]=='/') r=a+b+c/d;
						else r=a+b+c*d;
					}
				else if(s[3]=='-') 
					{
						if(s[5]=='+') r=a+b-c+d;
						else if(s[5]=='-') r=a+b-c-d;
						else if(s[5]=='/')r=a+b-c/d;
						else r=a+b-c*d;
					}
				else if(s[3]=='/')
					{
						if(s[5]=='+') r=a+b/c+d;
						else if(s[5]=='-') r=a+b/c-d;
						else if(s[5]=='/') r=a+b/c/d;
						else r=a+b/c*d;
					}
				else 
					{
						if(s[5]=='+') r=a+b*c+d;
						else if(s[5]=='-') r=a+b*c-d;
						else if(s[5]=='/')r=a+b*c/d;
						else r=a+b*c*d;
					}
			}
		else if(s[1]=='-') 
		{	
				if(s[3]=='+')
					{
						if(s[5]=='+') r=a-b+c+d;
						else if(s[5]=='-') r=a-b+c-d;
						else if(s[5]=='/')r=a-b+c/d;
						else r=a-b+c*d;
					}
				else if(s[3]=='-') 
					{
						if(s[5]=='+') r=a-b-c+d;
						else if(s[5]=='-') r=a-b-c-d;
						else if(s[5]=='/')r=a-b-c/d;
						else r=a-b-c*d;
					}
				else if(s[3]=='/')
					{
						if(s[5]=='+') r=a-b/c+d;
						else if(s[5]=='-') r=a-b/c-d;
						else if(s[5]=='/') r=a-b/c/d;
						else r=a-b/c*d;
					}
				else 
					{
						if(s[5]=='+') r=a-b*c+d;
						else if(s[5]=='-') r=a-b*c-d;
						else if(s[5]=='/')r=a-b*c/d;
						else r=a-b*c*d;
					}
			}
		else if(s[1]=='/')
		{	
				if(s[3]=='+')
					{
						if(s[5]=='+') r=a/b+c+d;
						else if(s[5]=='-') r=a/b+c-d;
						else if(s[5]=='/')r=a/b+c/d;
						else r=a/b+c*d;
					}
				else if(s[3]=='-') 
					{
						if(s[5]=='+')r=a/b-c+d;
						else if(s[5]=='-') r=a/b-c-d;
						else if(s[5]=='/')r=a/b-c/d;
						else r=a/b-c*d;
					}
				else if(s[3]=='/')
					{
						if(s[5]=='+') r=a/b/c+d;
						else if(s[5]=='-') r=a/b/c-d;
						else if(s[5]=='/')r=a/b/c/d;
						else r=a/b/c*d;
					}
				else 
					{
						if(s[5]=='+') r=a/b*c+d;
						else if(s[5]=='-') r=a/b*c-d;
						else if(s[5]=='/') r=a/b*c/d;
						else r=a/b*c*d;
					}
			}
		else 
		{	
				if(s[3]=='+')
					{
						if(s[5]=='+') r=a*b+c+d;
						else if(s[5]=='-') r=a*b+c-d;
						else if(s[5]=='/')r=a*b+c/d;
						else r=a*b+c*d;
					}
				else if(s[3]=='-') 
					{
						if(s[5]=='+')r=a*b-c+d;
						else if(s[5]=='-') r=a*b-c-d;
						else if(s[5]=='/')r=a*b-c/d;
						else r=a*b-c*d;
					}
				else if(s[3]=='/')
					{
						if(s[5]=='+') r=a*b/c+d;
						else if(s[5]=='-') r=a*b/c-d;
						else if(s[5]=='/')r=a*b/c/d;
						else r=a*b/c*d;
					}
				else 
					{
						if(s[5]=='+') r=a*b*c+d;
						else if(s[5]=='-')  r=a*b*c-d;
						else if(s[5]=='/') r=a*b*c/d;
						else  r=a*b*c*d;
					}
			}
		//	cout<<r<<endl;
			if(r==24) cout<<"Yes"<<endl;
			else cout<<"No"<<endl;
	}
	return 0;
} 

栈的方法,这个是我自己写的,测试没有问题,但是有部分测试点无法通过,有大神知道问题可以给我说一下,,

#include <iostream>  
#include <cstdio>
#include <set>   //自动排序, 不可重复  unordered_set
#include <sstream>    
#include <string>  //擦汗ar[] , string 
#include <typeinfo>
#include <algorithm>  //sort()   cmp
#include <vector>
#include <map>   //map a;   a.insert(pair<,>,())   a[10]="qewe"; 
#include <cctype> 
#include <iomanip>   //cout<<setw(10)<<left
#include <queue>
#include <cmath>//printf("%.2f",a)
#include <stack>
using namespace std;

int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int r=0;
		string s;
		cin>>s;
		stack<int> shu;
		stack<char> fu;    //×
		//利用栈的思想,构造两个栈,遇到乘除优先计算后再入栈,加减直接入栈
		for(int i=0;i<7;i++){
			if(s[i]>='0' &&s[i]<='9')//数字入栈 
				shu.push(s[i]-'0');
			else {
				if(s[i]=='+' ||s[i]=='-'){
					fu.push(s[i]);
				}
				else if(s[i]=='/'){//
					int n;
					n=shu.top()/(s[i+1]-'0');
					shu.pop();
					shu.push(n);
				//	cout<<"n="<<n<<endl;
					i++; 
				}
				else {
					int n;
					n=shu.top()*(s[i+1]-'0');
					shu.pop();
					shu.push(n);
				//	cout<<"n="<<n<<endl;
					i++; 
				}
			}
		}
		while(shu.size()-1) {//当数字栈中至少存在两个元素时,进行加减 
			int a=shu.top();
			shu.pop();
			int b=shu.top();
			shu.pop();
			if(fu.top()=='+'){
				int c=a+b;
				shu.push(c);
			//	cout<<"c+="<<c<<endl;
			}
			else if(fu.top()=='-'){
				int c=b-a;
				shu.push(c);
			//	cout<<"c-="<<c<<endl;
			}
			else break;
		}
	r=shu.top();
	if(r==24) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
	}
	return 0;
} 

下面推荐别人写的栈的方法,参见链接:添加链接描述

#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;

int n;
char a[10];

stack<int> num;
stack<char> sign;
int all;
int main()
{
    cin>>n;
    getchar();
    for(int i=1;i<=n;i++)
    {

        gets(a);
        all=0;
    while(!num.empty())num.pop();
    while(!sign.empty())sign.pop();
    int j=0;
    while(j<strlen(a))
    {

        if(a[j]<='9'&&a[j]>='0')
        {
            num.push(a[j]-'0');
        }
        else
            if(a[j]=='+')
        {
            sign.push(a[j]);

        }
        else
            if(a[j]=='-')
        {
            sign.push('+');
            num.push((a[j+1]-'0')*(-1));
            j++;
        }
        else
            if(a[j]=='x')
        {
            int ans=num.top();
            num.pop();
            num.push(ans*(a[j+1]-'0'));
            j++;
        }
        else
        {
            int ans=num.top();
            num.pop();
            num.push(ans/(a[j+1]-'0'));
            j++;
        }
        j++;
    }

    while(!num.empty())
    {
        all+=num.top();
        num.pop();

    }


    if(all==24) printf("Yes\n");
		else printf("No\n");
}
    return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_43269048/article/details/100057811