1 #include <cctype>//判断字符类型需要的头文件
2 #include<iostream>
3 #include <sstream>
4 using namespace std;
5
6 void Swap(long long &a, long long &b)
7 {
8 long long temp = a;
9 a = b;
10 b = temp;
11 }
12 void QuickSort(long long *arr, int start, int count)
13 {
14 if (count == 1)
15 {
16 return;
17 }
18 long long stand = arr[start];
19 Swap(arr[count / 2], stand);
20 for (int i = 0, j = count - 1; i < count / 2 && i < j; i++, j--)
21 {
22 while (arr[i] < stand&&i<count / 2 && i<j)
23 {
24 i++;
25 }
26 while (arr[j]>stand&&j>count / 2 && i < j)
27 {
28 j--;
29 }
30 Swap(arr[i], arr[j]);
31 }
32 QuickSort(arr, start, count / 2);
33 QuickSort(arr, count / 2 + 1, count - count / 2);
34 }
35 void quick_sort(long long *s, int l, int r)
36 {
37 if (l < r)
38 {
39 //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
40 int i = l, j = r, x = s[l];
41 while (i < j)
42 {
43 while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
44 j--;
45 if (i < j)
46 s[i++] = s[j];
47
48 while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
49 i++;
50 if (i < j)
51 s[j--] = s[i];
52 }
53 s[i] = x;
54 quick_sort(s, l, i - 1); // 递归调用
55 quick_sort(s, i + 1, r);
56 }
57 }
58 bool IsPrime(int n)
59 {
60 if (n<2)
61 {
62 //小于2的数即不是合数也不是素数
63 return false;
64 }
65 for (unsigned i = 2; i<n / 2 + 1; ++i)
66 {
67 // 和比它的一半小数相除,如果都除不尽,证明素数
68 if (0 == n % i)
69 {
70 // 除尽了,合数
71 return false;
72 }
73 }
74 return true; // 都没除尽,素数
75 }
76 bool IsPrime2(int n)
77 {
78 if (n < 2)
79 { // 小于2的数即不是合数也不是素数
80 return false;
81 }
82 static unsigned aPrimeList[] = { // 素数表
83 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
84 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 113,
85 193, 241, 257, 337, 353, 401, 433, 449, 577, 593, 641,
86 673, 769, 881, 929, 977, 1009, 1153, 1201, 1217, 1249,
87 1297, 1361, 1409, 1489, 1553, 1601, 1697, 1777, 1873,
88 1889, 2017, 2081, 2113, 2129, 2161, 2273, 2417, 2593,
89 2609, 2657, 2689, 2753, 2801, 2833, 2897, 3041, 3089,
90 3121, 3137, 3169, 3217, 3313, 3329, 3361, 3457, 3617,
91 3697, 3761, 3793, 3889, 4001, 4049, 4129, 4177, 4241,
92 4273, 4289, 4337, 4481, 4513, 4561, 4657, 4673, 4721,
93 4801, 4817, 4993, 5009, 5153, 5233, 5281, 5297, 5393,
94 5441, 5521, 5569, 5857, 5953, 6113, 6257, 6337, 6353,
95 6449, 6481, 6529, 6577, 6673, 6689, 6737, 6833, 6961,
96 6977, 7057, 7121, 7297, 7393, 7457, 7489, 7537, 7649,
97 7681, 7793, 7841, 7873, 7937, 8017, 8081, 8161, 8209,
98 8273, 8353, 8369, 8513, 8609, 8641, 8689, 8737, 8753,
99 8849, 8929, 9041, 9137, 9281, 9377, 9473, 9521, 9601,
100 9649, 9697, 9857
101 };
102
103 const int nListNum = sizeof(aPrimeList) / sizeof(unsigned);//计算素数表里元素的个数
104 for (unsigned i = 2; i<nListNum; ++i)
105 {
106 if (n / 2 + 1<aPrimeList[i])
107 {
108 return true;
109 }
110 if (0 == n%aPrimeList[i])
111 {
112 return false;
113 }
114 }
115 /*由于素数表中元素个数是有限的,那么对于用素数表判断不到的数,就只有用笨蛋办法了*/
116 for (unsigned i = aPrimeList[nListNum - 1]; i<n / 2 + 1; i++)
117 {
118 if (0 == n%i)
119 {
120 // 除尽了,合数
121 return false;
122 }
123 }
124 return true;
125 }
126
127
128
129 int main()
130 {
131 /*
132 1059. C语言竞赛(20)
133
134 时间限制
135 200 ms
136 内存限制
137 65536 kB
138 代码长度限制
139 8000 B
140 判题程序
141 Standard
142 作者
143 CHEN, Yue
144 C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
145
146 0. 冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
147 1. 排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
148 2. 其他人将得到巧克力。
149
150 给定比赛的最终排名以及一系列参赛者的ID,你要给出这些参赛者应该获得的奖品。
151
152 输入格式:
153
154 输入第一行给出一个正整数N(<=10000),是参赛者人数。随后N行给出最终排名,每行按排名顺序给出一位参赛者的ID(4位数字组成)。接下来给出一个正整数K以及K个需要查询的ID。
155
156 输出格式:
157
158 对每个要查询的ID,在一行中输出“ID: 奖品”,其中奖品或者是“Mystery Award”(神秘大奖)、或者是“Minion”(小黄人)、或者是“Chocolate”(巧克力)。如果所查ID根本不在排名里,打印“Are you kidding?”(耍我呢?)。如果该ID已经查过了(即奖品已经领过了),打印“ID: Checked”(不能多吃多占)。
159
160 输入样例:
161 6
162 1111
163 6666
164 8888
165 1234
166 5555
167 0001
168 6
169 8888
170 0001
171 1111
172 2222
173 8888
174 2222
175 输出样例:
176 8888: Minion
177 0001: Chocolate
178 1111: Mystery Award
179 2222: Are you kidding?
180 8888: Checked
181 2222: Are you kidding?
182 */
183
184 int count = 0;
185 cin >> count;//输入个数
186
187 string members[10000];
188 for (size_t i = 0; i < count; i++)
189 {
190 cin >> members[i];//录入 ID 排名
191 }
192
193 int countK = 0;//查询的个数
194 string membersK[10000];
195 string membersKvalue[10000];//对应的值
196 cin >> countK;
197 for (size_t i = 0; i < countK; i++)
198 {
199 cin >> membersK[i];//录入 查询ID
200 int flag = 0;//标志位 判断是否 存在该id
201 int flag1 = 0;//标志位 判断是否 查询过
202 for (size_t j = 0; j < count; j++)
203 {
204 if (membersK[i] == members[j])
205 {
206 flag = 1;
207 if (j == 0)
208 {
209 membersKvalue[i] = "Mystery Award";
210 break;
211 }
212 if (IsPrime2(j+1))
213 {
214 membersKvalue[i] = "Minion";
215 break;
216 }
217 membersKvalue[i] = "Chocolate";
218 break;
219 }
220 }
221
222 for (size_t k = 0; k <i; k++)
223 {
224 if (membersK[k] == membersK[i])
225 {
226 flag1 = 1;
227 }
228 }
229 if (flag1)
230 {
231 membersKvalue[i] = "Checked";
232 }
233 if (flag == 0)
234 {
235 membersKvalue[i] = "Are you kidding?";
236 }
237 }
238
239 for (size_t i = 0; i < countK; i++)
240 {
241 cout << membersK[i] << ":" << membersKvalue[i] << endl;
242 }
243
244
245
246
247 return 0;
248 }