C++ |【机试】26.3.19

C++ |【机试】26.3.19 题目124.分数化小数问题描述写一个程序输入一个形如N/D的分数(N是分子D是分母)输出它的小数形式。如果小数有循环节的话把循环节放在一对圆括号中。例如 1/3 .33333333 写成0.(3)41/333 0.123123123... 写成0.(123)用xxx.0 表示整数典型的转化例子 1/3 0.(3)22/5 4.41/7 0.(142857)2/2 1.03/8 0.37545/56 0.803(571428)输入说明单独的一行包括被空格分开的 N和D 1 N,D 100000。输出说明小数的表示方法上面说的很明白了如果输出的长度超过76个字符每行输出76个字符包括小数点、括号等。输入范例45 56输出范例0.803(571428)数组法的核心用pos[r]记录余数r第一次出现的位置pos[r] 0表示余数从未出现过当遇到重复余数时说明找到了循环节通过位置信息可以分割小数部分长除法int start -1; // 循环节开始位置-1表示还没找到while (r ! 0) { // 只要还有余数就继续除// 关键检查当前余数是否出现过if (pos[r] ! 0) { // 如果这个余数之前出现过start pos[r]; // 记录循环节开始的位置break; // 找到循环节退出循环}// 如果余数是第一次出现就记录它的位置pos[r] i; // i是当前要计算的小数位数// 计算下一位小数r * 10; // 余数补0s to_string(r / D); // 当前位的小数 补0后的数 ÷ 分母r % D; // 新的余数i; // 小数位数1}#includebits/stdc.h using namespace std; int main() { // 输入部分 // N: 分子, D: 分母, 例如输入 45 56 表示计算 45/56 int N, D; cin N D; // 处理整数部分 int z N / D; // z: 整数部分, 例如 45/560, 所以z0 int r N % D; // r: 余数, 用于后续计算小数部分, 例如45%5645 // 情况1: 如果能整除余数为0, 直接输出整数形式 if (r 0) { cout z .0 endl; // 例如 2/2 1.0 return 0; } // 准备计算小数部分 // pos数组: 记录每个余数第一次出现的位置第几位小数 // 因为分母D≤100000, 余数范围0~D-1, 所以数组大小设为100000足够 int pos[100000] {0}; // 初始全0, 表示所有余数都未出现过 string s ; // s: 存储所有小数位的数字不带小数点 int i 1; // i: 当前正在计算第几位小数从1开始计数 // 模拟长除法寻找循环节 // start: 循环节开始的位置, -1表示未找到循环节 int start -1; // 长除法原理: 只要还有余数, 就继续除 while (r ! 0) { // 关键判断: 当前余数r是否出现过 if (pos[r] ! 0) { // 如果出现过pos[r]记录了它第一次出现的位置 start pos[r]; // 那么这个位置就是循环节的开始 break; // 找到循环节, 退出循环 } // 如果是第一次遇到这个余数, 记录它出现的位置 pos[r] i; // 将当前余数r的位置记为i // 长除法的核心计算: r * 10; // 余数补0, 例如余数45变成450 s to_string(r / D); // 当前位的小数 补0后的数 ÷ 分母, 例如450/568, 所以这一位是8 r % D; // 计算新的余数, 例如450%562 i; // 准备计算下一位小数 } // 此时: // s中存储了所有小数位, 例如45/56, s 803571428 // 如果找到了循环节, start记录了循环开始的位置 // 构建最终输出字符串 string res to_string(z) .; // res: 最终结果, 先加上整数部分和点, 例如 0. if (start ! -1) { // 情况2: 有循环节 // 将小数部分分成两部分: string a s.substr(0, start - 1); // a: 非循环部分, 从第1位到循环节前一位 // 例如start7, 取前6位 803 string b s.substr(start - 1); // b: 循环部分, 从循环节开始到最后 // 例如从第7位开始取 571428 res a ( b ); // 组合成 0.803(571428) } else { // 情况3: 无循环节有限小数 res s; // 直接加上所有小数位, 例如 3/8 0.375 } // 处理输出长度限制 // 题目要求: 如果输出长度超过76字符, 每76字符换行 for (int j 0; j res.length(); j) { cout res[j]; // 逐个字符输出 // 判断是否需要换行: // 条件1: (j 1) % 76 0 → 已经输出了76的整数倍个字符 // 条件2: j ! res.length() - 1 → 当前不是最后一个字符 // 两个条件同时成立时才换行, 避免在最后多一个空行 if ((j 1) % 76 0 j ! res.length() - 1) { cout endl; // 换行 } } cout endl; // 最后输出一个换行 return 0; }题目125.回文或镜面回文问题描述给出字符串判断其是否是回文或镜面回文。给定一个由数字或字母组成的字符串如果该字符串正读、反读都一样则该字符串被称作回文字符串。例如ABCDEDCBA就是回文字符串。给定一个由数字或字母组成的字符串将字符串中每个字符转换为对应的镜面字符有镜面字符或保持不变无对应镜面字符如果转换后的字符串反读的结果与字符串转换前正读的结果相同则该字符串被称作镜面字符串。例如3AIAE就是镜面字符串。如果一个字符串既是回文字符串又是镜面字符串则称该字符串为镜面回文字符串。例如ATOYOTA就是镜面回文字符串。所有有效字符与其镜面字符见下表字符镜面字符字符镜面字符字符镜面字符AAMMYYBNZ5COO11DP2SE3Q3EFR4GS25ZHHTT6IIUU7JLVV88KWW9LJXX注意数字0与字母O视作同一字符都用字母O表示。输入说明输入包含多个字符串每行一个字符串每个字符串包含1—20个有效字符保证每个字符串中不会出现非法字符。输出说明对每个输入的字符串在第1列输出该字符串并紧跟着输出与下表中标准对应的字符串。每组输出数据后面必须输出一空行。输出字符串 标准(含义) -- is not a palindrome. 该字符串非回文也非镜面字符串 -- is a regular palindrome. 该字符串是回文但非镜面字符串 -- is a mirrored string. 该字符串非回文但是镜面字符串 -- is a mirrored palindrome. 该字符串是回文也是镜面字符串输入范例3AIAENOTAPALINDROMEAHA输出范例3AIAE -- is a mirrored string.NOTAPALINDROME -- is not a palindrome.AHA -- is a mirrored palindrome.// 镜面字符映射表 - 定义时全部初始化为0 char mir[256] {0}; // 初始化镜面映射表的函数 void initMirror() { // 设置有效字符的镜面映射 mir[A] A; mir[E] 3; mir[H] H; mir[I] I; mir[J] L; mir[L] J; mir[M] M; mir[O] O; mir[S] 2; mir[T] T; mir[U] U; mir[V] V; mir[W] W; mir[X] X; mir[Y] Y; mir[Z] 5; mir[1] 1; mir[2] S; mir[3] E; mir[5] Z; mir[8] 8; }// 一次遍历同时判断回文和镜面 for (int i 0; i len/2; i) { int j len - 1 - i; // 对称位置 // 判断回文正反读是否一样 if (s[i] ! s[j]) pal false; // 判断镜面当前字符的镜面是否等于对称位置的字符 // mir[s[i]] 0 表示当前字符没有镜面映射 if (mir[s[i]] 0 || mir[s[i]] ! s[j]) mirr false; // 如果两个都已经不成立可以提前退出 if (!pal !mirr) break; }条件1:mir[s[i]] 0含义检查当前字符是否有镜面映射例子1字符 Bs[i] Bmir[B] 0 // 因为B在映射表中没有定义mir[s[i]] 0 → true // 条件成立B没有镜面映射例子2字符 As[i] Amir[A] A // A有镜面映射映射到自身mir[s[i]] 0 → false // 条件不成立#includebits/stdc.h using namespace std; // 镜面字符映射表 - 定义时全部初始化为0 char mir[256] {0}; // 初始化镜面映射表的函数 void initMirror() { // 设置有效字符的镜面映射 mir[A] A; mir[E] 3; mir[H] H; mir[I] I; mir[J] L; mir[L] J; mir[M] M; mir[O] O; mir[S] 2; mir[T] T; mir[U] U; mir[V] V; mir[W] W; mir[X] X; mir[Y] Y; mir[Z] 5; mir[1] 1; mir[2] S; mir[3] E; mir[5] Z; mir[8] 8; } int main() { // 初始化镜面映射表 initMirror(); string s; // 循环读入每一行直到文件结束 while (getline(cin, s)) { if (s.empty()) continue; // 跳过空行 string org s; // 保存原始输入用于输出 // 处理数字0转换为字母O题目要求 for (int i 0; i s.length(); i) { if (s[i] 0) s[i] O; } int len s.length(); bool pal true; // 是否是回文 bool mirr true; // 是否是镜面 // 一次遍历同时判断回文和镜面 for (int i 0; i len/2; i) { int j len - 1 - i; // 对称位置 // 判断回文正反读是否一样 if (s[i] ! s[j]) pal false; // 判断镜面当前字符的镜面是否等于对称位置的字符 // mir[s[i]] 0 表示当前字符没有镜面映射 if (mir[s[i]] 0 || mir[s[i]] ! s[j]) mirr false; // 如果两个都已经不成立可以提前退出 if (!pal !mirr) break; } // 输出结果 cout org; if (!pal !mirr) cout -- is not a palindrome. endl; else if (pal !mirr) cout -- is a regular palindrome. endl; else if (!pal mirr) cout -- is a mirrored string. endl; else cout -- is a mirrored palindrome. endl; cout endl; // 每组输出后加空行 } return 0; }翻译Overfitting is a common problem during the training of machine learning models. When a model performs extremely well on training data but poorly on test data, it is considered to suffer from overfitting. This usually occurs when the model is too complex or when the amount of training data is insufficient.在训练机器学习模型的过程中过拟合是一个常见的问题当一个模型在训练集表现的很好但是在测试集却表现的很差它就会被认为经历了过拟合这种情况通常出现在当模型过于复杂或者是训练数据的总数是不充分的时候。To reduce overfitting, researchers have proposed various techniques such as regularization, data augmentation, and cross-validation.Regularization methods introduce penalty terms into the loss function to limit the magnitude of model parameters, thereby making the model simpler and more stable.为了减少过拟合研究人员提出了许多的技术比如数据增强 交叉印证。正则化方法在损失函数中引入惩罚项以限制模型参数的大小从而使模型更简单、更稳定。Data augmentation increases the diversity of training data by applying operations such as rotation,cropping, oradding noise to the original data. In addition, cross-validationevaluates the generalization abilityof a model by repeatedly splitting the dataset into training and validation sets. These techniques can effectively improve the performance of machine learning models in real-world applications..数据增强增加了训练数据的多样性通过应用一些其他的手段比如翻转裁剪增加噪音对于原始的数。另外交叉验证评估了模型的泛化能力通过重复的分割训练集与验证集在现实世界的应用中这些技术可以高效地增强机器学习模型的表现能力。