#include<iostream>
#include<string.h>
using namespace std;
#define swap(a,b) {a^=b;b^=a;a^=b;}
// 1: 16进制转10进制
int hex2decimal(string hexNum) {
int n = 0;
int len = hexNum.length();
for (int i = 0; i < len; i++) {
n <<= 4;
if(hexNum[i]>='0'&& hexNum[i]<='9')
n += int(hexNum[i] - '0');
else
n += int(hexNum[i] - 'A')+10;
}
return n;
}
// 2: 素数判断
bool primeNum(int num) {
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
// 3: 最大公因数
int GCD(int a, int b) {
return (a % b == 0 ? b : GCD(b, a % b));
}
// 4: 最小公倍数
int LCM(int a, int b) {
return a * b / GCD(a, b);
}
// 5: 冒泡排序
void sortArray(int* a, int n) {
int state = 0;
for (int i = 0; i < n - 1; i++) {
state = 0;
for (int j = n - 1; j > i; j--) {
if (a[j - 1] > a[j]) {
swap(a[j - 1], a[j]);
state = 1;
}
}
if (state == 0) break;
}
}
// 6: 逆置数组
void inversion(int(*array)[3], int r, int c) {
int i, j;
for (i = 0; i < r; i++) {
for (j = i; j < c; j++) {
if(i!=j)
swap(array[i][j], array[j][i]);
}
}
}
// 7: 输出数组
void displayArray(int(*array)[3], int r, int c) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cout << array[i][j] << " ";
}
cout << endl;
}
}
// 8: 计算方差
double variance(int* array, int n) {
double sum = 0;
for (int i = 0; i < n; i++) sum += array[i];
double average = sum / n;
double res = 0;
double sub = 0;
for (int i = 0; i < n; i++) {
sub = average - array[i];
res += sub * sub;
}
return res / n;
}
// 9: 数字转成字符串
void intToString(int num, string& result) {
int i;
if ((i = num / 10) != 0) intToString(i, result);
result += (num % 10 + '0');
}
// 10: 逆转字符串
void reverseString(string&a) {
int len = a.length();
for (int i = 0; i < len / 2; i++) {
swap(a[i], a[len - 1 - i]);
}
}
// 11: 连接字符串
string connectString(string& a, string b) {
return a.append(b.c_str());
}
int main() {
string strs[10];
int nums[10];
string str;
// 1.要求1
for (int i = 0; i < 10; i++) {
cin >> strs[i];
}
// 2.要求2
for (int i = 0; i < 10; i++) {
nums[i] = hex2decimal(strs[i]);
cout << nums[i] << " ";
}
cout << endl;
// 3. 要求3
for (int i = 0; i < 10; i++) {
cout << (primeNum(nums[i])?"Y":"N") << " ";
}
cout << endl;
// 4.要求4 最大公因数,也称最大公约数、最大公因子
cout << GCD(nums[0], nums[1]) << endl;
// 5.要求5
cout <<LCM(nums[0], nums[1]) << endl;
// 6. 要求6 排序
sortArray(nums, 10);
for (int i = 0; i < 10; i++) {
cout << nums[i] << " ";
}
cout << endl;
// 7.方差
printf("%.2lf\n", variance(nums,10));
// 8.空一行
cout << endl << endl;
// 9. 二维数组
int index = 0;
int array[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
array[i][j] = nums[index++];
}
}
displayArray(array, 3, 3);
// 10.空一行
cout << endl << endl;
// 11. 逆置二维数组并输出
inversion(array, 3, 3);
displayArray(array, 3, 3);
// 12.空一行
cout << endl << endl;
// 13.数字->字符串,反序存储,两两拼接
string newStrs[10];
for (int i = 0; i < 10; i++) {
intToString(nums[i], newStrs[i]);
reverseString(newStrs[i]);
}
for (int i = 0; i < 10; i += 2) {
cout << connectString(newStrs[i], newStrs[i+1]) << " ";
}
}
/*
10 14 29 17 C8 31 9 23 25 AB
*/