# Lab6 參考解答
# Bengola
> Author: TA
```c=
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#define LENGTH 1000000
int bengola[LENGTH] = {0};
int sumOfDigit(int n) {
int sum = 0;
while (n) {
sum += n % 10;
n /= 10;
}
return sum;
}
void buildTable() {
bool isPrime[LENGTH];
for (int i = 0; i < LENGTH; i++) {
isPrime[i] = true;
}
isPrime[0] = false;
isPrime[1] = false;
for (long long int i = 2; i < LENGTH; i++) {
if (isPrime[i]) {
for (long long int j = i * i; j < LENGTH; j += i) {
isPrime[j] = false;
}
bengola[i] = bengola[i - 1] + ((isPrime[sumOfDigit(i)]) ? 1 : 0);
} else {
bengola[i] = bengola[i - 1];
}
}
}
int main() {
buildTable();
int testCase, lower, upper;
scanf("%d", &testCase);
while (testCase--) {
scanf("%d%d", &lower, &upper);
printf("%d\n", bengola[upper] - bengola[lower - 1]);
}
return 0;
}
```
# Sports Lottery
> Author: TA
```c=
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PLAYERNUM 82
int n, m, k;
int selectCols[5];
int orderCols[5];
/* FIFA 2017 PLAYER FIELDS */
typedef struct player {
int id; // 0
int age; // 1
float potential; // 2
char nationality[32]; // 3
char name[32]; // 4
} Player;
/* DO NOT MODIFY ANY DATA */
const Player o_players[PLAYERNUM] = {
{233055, 26, 0.73, "Japan", "D. Suzuki"},
{220488, 21, 0.68, "Italy", "F. Costa"},
{235559, 18, 0.62, "France", "L. Alessandri"},
{215570, 21, 0.72, "Republic of Ireland", "G. Rea"},
{227536, 25, 0.77, "Mali", "M. Marega"},
{223186, 20, 0.67, "Denmark", "J. Thomasen"},
{237218, 21, 0.66, "United States", "J. Hayes"},
{226523, 20, 0.76, "Sweden", "F. Brorsson"},
{232718, 31, 0.66, "Japan", "Y. Takahashi"},
{189891, 25, 0.62, "England", "F. Franks"},
{216018, 29, 0.66, "Argentina", "J. Blanco"},
{180819, 28, 0.83, "England", "A. Lallana"},
{175932, 27, 0.73, "Belgium", "R. De Laet"},
{202078, 25, 0.75, "United States", "D. Nagbe"},
{211536, 20, 0.73, "Scotland", "M. O'Hara"},
{213378, 25, 0.69, "Ukraine", "I. Berezovskyi"},
{220833, 19, 0.7, "France", "A. Mandrea"},
{189242, 24, 0.89, "Brazil", "Coutinho"},
{220782, 20, 0.74, "France", "M. Ilaimaharitra"},
{188135, 27, 0.78, "Spain", "Juanfran"},
{229083, 23, 0.67, "Denmark", "C. Jakobsen"},
{189024, 30, 0.71, "Ecuador", "M. Banguera"},
{237599, 18, 0.68, "Italy", "A. De Angelis"},
{227678, 18, 0.8, "England", "E. Konsa"},
{211061, 25, 0.75, "Romania", "A. Maxim"},
{162900, 30, 0.67, "Australia", "N. Kilkenny"},
{173654, 28, 0.68, "Scotland", "P. McGowan"},
{232882, 20, 0.77, "Japan", "K. Misao"},
{208916, 29, 0.73, "Saudi Arabia", "M. Al Sahlawi"},
{215455, 21, 0.8, "Croatia", "B. Petkovic"},
{228348, 23, 0.71, "Morocco", "F. Rherras"},
{237889, 17, 0.63, "Republic of Ireland", "J. Keaney"},
{211707, 25, 0.68, "Scotland", "P. McGinn"},
{231857, 22, 0.67, "United States", "J. Calistri"},
{202789, 24, 0.78, "Germany", "A. Schwolow"},
{229776, 19, 0.74, "Denmark", "M. Hedegaard"},
{187528, 29, 0.7, "Russia", "K. Kombarov"},
{198731, 23, 0.71, "Kosovo", "E. Rashani"},
{207897, 24, 0.74, "Germany", "A. Jung"},
{169386, 34, 0.74, "Italy", "S. Floccari"},
{237966, 18, 0.71, "Portugal", "Paulo Alves"},
{233505, 17, 0.64, "England", "R. Sandford"},
{215004, 21, 0.68, "Argentina", "L. Salas"},
{228613, 23, 0.69, "Saudi Arabia", "F. Al Masrahi"},
{202921, 26, 0.72, "New Zealand", "J. Gleeson"},
{184267, 26, 0.82, "Algeria", "Y. Brahimi"},
{233917, 18, 0.75, "Switzerland", "D. Kutesa"},
{235804, 19, 0.62, "Denmark", "B. Lund"},
{211132, 22, 0.74, "Spain", "Andrés Prieto"},
{238514, 18, 0.67, "Argentina", "A. Verdugo"},
{230561, 18, 0.76, "Netherlands", "J. Grot"},
{236690, 25, 0.75, "Cameroon", "M. Ngadeu-Ngadjui"},
{235353, 18, 0.85, "Senegal", "I. Sarr"},
{237174, 28, 0.54, "Peru", "R. Frank"},
{201999, 23, 0.77, "England", "J. Flanagan"},
{179475, 32, 0.71, "Ukraine", "O. Rybka"},
{233171, 24, 0.66, "Japan", "T. Ishikawa"},
{209162, 23, 0.69, "Colombia", "E. Correa"},
{187942, 27, 0.74, "Benin", "R. Gestede"},
{200653, 27, 0.74, "Argentina", "G. Burdisso"},
{223615, 28, 0.67, "Argentina", "C. Chimino"},
{210488, 24, 0.71, "Netherlands", "P. van Ooijen"},
{173695, 29, 0.68, "Scotland", "M. Reynolds"},
{162890, 30, 0.72, "United States", "J. Spector"},
{159578, 32, 0.7, "Jamaica", "C. Donaldson"},
{189172, 26, 0.74, "Spain", "Fidel"},
{179586, 27, 0.68, "DR Congo", "C. Mongongu"},
{236001, 18, 0.8, "Brazil", "Rai"},
{179973, 27, 0.68, "Switzerland", "M. Morganella"},
{188599, 31, 0.71, "Italy", "M. Antenucci"},
{220041, 21, 0.69, "Switzerland", "N. Luchinger"},
{211703, 30, 0.74, "Germany", "M. Schnatterer"},
{214331, 29, 0.7, "Colombia", "L. Ruiz"},
{213367, 23, 0.72, "France", "L. Abergel"},
{209024, 23, 0.63, "Republic of Ireland", "A. Barry"},
{201374, 26, 0.71, "Spain", "Fernandez"},
{214899, 31, 0.58, "England", "D. Wright"},
{215404, 24, 0.73, "Brazil", "Bruno Pires"},
{231620, 18, 0.66, "South Africa", "B. Banda Jr."},
{233981, 32, 0.63, "Brazil", "Alan Besseiro"},
{194954, 25, 0.67, "Russia", "V. Ustinov"},
{167706, 28, 0.73, "Denmark", "N. Bendtner"},
};
/* TODO: SORT SPECIFIED COLUMNS IN ASCENDING ORDER */
int compare(const void *a, const void *b) {
/* WRITE YOUR CODE HERE */
const Player *x = a;
const Player *y = b;
int flag;
for (int i = 0; i < m; i++) {
switch (orderCols[i]) {
case 1:
if (x->age == y->age) {
continue;
}
return (x->age > y->age) ? 1 : -1;
case 2:
if (x->potential == y->potential) {
continue;
}
return (x->potential > y->potential) ? 1 : -1;
case 3:
flag = strcmp(x->nationality, y->nationality);
if (flag == 0) {
continue;
}
return flag;
case 4:
flag = strcmp(x->name, y->name);
if (flag == 0) {
continue;
}
return flag;
}
}
return (x->id > y->id) ? 1 : -1;
}
/* TODO: PRINT k PLAYERS WITH n COLUMNS AFTER SORTING */
void print(const Player *p) {
/* WRITE YOUR CODE HERE */
for (int row = 0; row < k; row++) {
for (int i = 0; i < n; i++) {
if (i != 0) {
printf(" ");
}
switch (selectCols[i]) {
case 0:
printf("%d", p[row].id);
break;
case 1:
printf("%d", p[row].age);
break;
case 2:
printf("%.2f", p[row].potential);
break;
case 3:
printf("%s", p[row].nationality);
break;
case 4:
printf("%s", p[row].name);
break;
}
}
printf("\n");
}
return;
}
int main() {
int testCase;
scanf("%d", &testCase);
while (testCase--) {
// read #selections, #orders, #output rows
scanf("%d%d%d", &n, &m, &k);
// read selected column index
for (int i = 0; i < n; i++) {
scanf("%d", &selectCols[i]);
}
// read order column index
for (int i = 0; i < m; i++) {
scanf("%d", &orderCols[i]);
}
// temp variable
Player players[PLAYERNUM];
// TODO : USE `memcpy` TO COPY `o_players` TO `players`
memcpy(&players, &o_players, sizeof(o_players));
// TODO : USE `qsort` with `compare` function above
qsort((void *)players, PLAYERNUM, sizeof(players[0]), compare);
// TODO : Print players via `print` function above
print(players);
printf("\n");
}
return 0;
}
```