CSP测试201903-2二十四点(C++)

 

 更新:最近又遇上了这道题,不过要求只能用C语言,第二次做这道题的时候我发现了我之前犯的错误,不应该用float类型运算,题目要求就是整除

思路:用数组模拟栈,遇到‘x’和‘/’就运算,遇到‘-’取负值,最后把栈内的数字求和就行了

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()
 5 {
 6     int n,i;
 7     scanf("%d",&n);
 8     int ans[n];
 9     for(i=0;i<n;i++)
10     {
11         char ysf[3];   //符号栈
12         int num[4];
13         int j,flag=0;   //数字栈
14         for(j=0;j<7;j++)
15         {
16             if(j%2==0)
17                 scanf("%d",&num[3-j/2]);
18             else
19                 scanf("%c",&ysf[flag++]);
20         }
21         flag = 4;
22         for(j=0;j<3;j++)
23         {
24             if(ysf[j] == 'x')
25             {
26                 num[2-j] *= num[3-j];
27                 if(j == 1)
28                     num[2] = num[3];
29                 else if(j==2)
30                 {
31                     num[1] = num[2];
32                     num[2] = num[3];
33                 }
34                 flag--;
35             }
36             else if(ysf[j] == '/')
37             {
38                 num[2-j] = num[3-j]/num[2-j];
39                 if(j == 1)
40                     num[2] = num[3];
41                 else if(j==2)
42                 {
43                     num[1] = num[2];
44                     num[2] = num[3];
45                 }
46                 flag--;
47             }
48             else if(ysf[j] == '-')
49                 num[2-j] = 0-num[2-j];
50         }
51         ans[i] = 0;
52         for(j=0;j<flag;j++)
53         {
54             ans[i] += num[j];
55         }
56     }
57     for(i=0;i<n;i++)
58     {
59         if(ans[i] == 24)
60             printf("Yes\n");
61         else
62             printf("No\n");
63     }
64 
65     return 0;
66 }

运行结果100分

 

 

之前的代码

  1 /*
  2 用两个数组分别存放数字和运算符
  3 Calpoint计算是不是24点,Getlop返回运算符类型
  4 重点在于确定优先级,对三个转化为对应数字的算符排序,得到计算顺序
  5 易错点整除:先进行除运算会导致精度丢失,改成float类型,记得最后对结果强制转换
  6 */
  7 #include <iostream>
  8 #include <string>
  9 #include "stdlib.h"
 10 using namespace std;
 11 
 12 int Getlop(char relop)
 13 {
 14     if(relop == '+')
 15         return 1;
 16     else if(relop == '-')
 17         return 2;
 18     else if(relop == 'x')
 19         return 3;
 20     else
 21         return 4;
 22 }
 23 
 24 float Cal(int rel,float num1,float num2)
 25 {
 26     if(rel == 1)
 27         return (num1+num2);
 28     else if(rel == 2)
 29         return (num1-num2);
 30     else if(rel == 3)
 31         return (num1*num2);
 32     else
 33         return (num1/num2);
 34 }
 35 
 36 int Calpoint(int n[],char l[])
 37 {
 38     int a = Getlop(l[0]);
 39     int b = Getlop(l[1]);
 40     int c = Getlop(l[2]);
 41     float sum=0;
 42     if(a<b)
 43     {
 44         if(b<c)
 45         {
 46             sum = Cal(a,n[0],Cal(b,n[1],Cal(c,n[2],n[3])));
 47         }
 48         else
 49         {
 50             if(a<c)
 51             {
 52                 sum = Cal(a,n[0],Cal(c,Cal(b,n[1],n[2]),n[3]));
 53             }
 54             else
 55             {
 56                 sum = Cal(c,Cal(a,n[0],Cal(b,n[1],n[2])),n[3]);
 57             }
 58         }
 59 
 60     }
 61     else
 62     {
 63         if(a>=c)
 64         {
 65             if(b>=c)
 66             {
 67                 sum = Cal(c,Cal(b,Cal(a,n[0],n[1]),n[2]),n[3]);
 68             }
 69             else
 70             {
 71                 sum = Cal(b,Cal(a,n[0],n[1]),Cal(c,n[2],n[3]));
 72             }
 73         }
 74         else
 75         {
 76             sum = Cal(b,Cal(a,n[0],n[1]),Cal(c,n[2],n[3]));
 77         }
 78     }
 79     if((int)sum == 24)
 80         return 1;
 81     else
 82         return 0;
 83 }
 84 
 85 int main()
 86 {
 87     int n,m=0;
 88     string str;
 89     int num[4];
 90     char lop[3];
 91     cin >> n;
 92     int yorn[n];
 93     for(m=0;m<n;m++)
 94     {
 95         cin >> str;
 96         int i=0,j=0,k=0;
 97         for(i=0;i<7;i++)
 98         {
 99             if(i == 1 || i == 3 || i == 5)
100             {
101                 lop[j] = str.at(i);
102                 j++;
103             }
104             else
105             {
106                 char ch[1];
107                 ch[0] = str.at(i);
108                 num[k] = atoi(ch);
109                 k++;
110             }
111         }
112         yorn[m] = Calpoint(num,lop);
113     }
114 
115     int i=0;
116     for(i=0;i<n;i++)
117     {
118         if(yorn[i] == 1)
119             cout << "Yes" << endl;
120         else
121             cout << "No" << endl;
122     }
123 
124     return 0;
125 }

我用了比较笨的方法,主要是没想到用栈。测试结果只有70分,一直没发现哪里不对,先码了,以后再改。

 

posted @ 2020-09-07 23:33  梵蒂冈宝石  阅读(344)  评论(0编辑  收藏  举报