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 }