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分,一直没发现哪里不对,先码了,以后再改。