c++蓝桥杯题目积累

📅 发布时间:2026/7/11 17:35:07 👁️ 浏览次数:
c++蓝桥杯题目积累
一、P1055 [NOIP 2008 普及组] ISBN 号码 - 洛谷#includebits/stdc.h using namespace std; int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); string s; cins; string digits; for(char c:s){ if(c!-) digitsc; } int mod0,sum0; for(int i0;i9;i){ sum(digits[i]-0)*(i1); } modsum%11; char correct; if(mod10) correctX; else correct0mod; if(correctdigits[9]) coutRightendl; else{ string ress; res[12]correct; coutresendl; } return 0; }1.使用string来提取纯数字用字符来遍历字符串而不是数组。2.将字符数字-0转换为整数整数’0‘转换为字符数字。二、P5723 【深基4.例13】质数口袋 - 洛谷用于处理1e12的质数的优解#includebits/stdc.h using namespace std; #define ll long long bool isPrime(ll n){ if(n1) return false; if(n2) return true; if(n%20) return false; for(ll i3;i*in;i2){ if(n%i0) return false; } return true; } int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); ll l,cnt0,sum0; cinl; for(ll i2;il;i){ if(l-sumi)break; if(isPrime(i)) { coutiendl; cnt; sumi; } } coutcntendl; return 0; }更优解埃氏筛法// 埃氏筛法预筛[2, max_n]内的质数 vectorbool sieve(ll max_n){ vectorbool is_prime(max_n 1, true); is_prime[0] is_prime[1] false; for(ll i2; i*i max_n; i){ if(is_prime[i]){ for(ll ji*i; j max_n; ji){ is_prime[j] false; } } } return is_prime; } // 主函数中替换质数收集逻辑 ll max_n b; vectorbool is_prime sieve(max_n); for(ll ia; i b; i){ if(is_prime[i]){ c.push_back(i); } }三、P1217 [USACO1.5] 回文质数 Prime Palindromes - 洛谷当普通数组存储在栈上的长度达到1e5以上的时候使用vector存储在堆上不容易栈溢出更优1e4为浮点数不能直接int a[1e5];需要typedef long long ll; const ll MAX1e4; ll a[MAX];优先判断回文数再判断质数提高效率。其他注意点如下注释中#includebits/stdc.h using namespace std; typedef long long ll; const ll MAX 1e8 5; bool isPrime(ll n){ if(n 1) return false; if(n 2) return true; if(n % 2 0) return false; for(ll i3; i*i n; i2){ if(n % i 0) return false; } return true; } bool isHui(ll n){ if(n 0 || (n % 10 0 n ! 0)) return false; if(n 10) return true; ll rev 0; ll temp n; //用 temp 副本存储 n避免修改原参数 while(temp rev){ rev rev * 10 temp % 10; temp / 10; } return temp rev || temp rev / 10; } int main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); ll a, b; cin a b; vectorll c; // 存储区间内的质数 vectorll res; // 存储既是质数又是回文数的结果 for(ll i a; i b; i){ if(isHui(i)){ c.push_back(i); } } for(ll num : c){ if(isPrime(num)){ res.push_back(num); } } for(ll ans : res){ cout ans \n; // 用\n代替endl更快 } return 0; }vectorint vec {1,2,3,4}; cout vec.size() endl; // 输出 4元素个数 cout vec.capacity() endl; // 输出 ≥4如 4 cout vec.front() endl; // 1首元素 cout vec.back() endl; //4尾元素 if (vec.empty()) { cout 空数组; } else { cout 非空; }const ll MAX 1e8 5; vectorll c(MAX); // 长度 1e85堆上分配无栈溢出只要内存足够 vectorll res; // 动态收集结果无需提前定义长度// 方式 1固定行数和列数如 100 行 200 列元素默认 0 vectorvectorint dp(100, vectorint(200)); // dp[100][200] // 方式 2动态行数如邻接表n 个节点每个节点的邻接节点动态添加 int n 10; vectorvectorint adj(n); // 10 个空数组 adj[0].emplace_back(1); // 节点 0 连接节点 1 adj[0].emplace_back(2); // 节点 0 连接节点 2 // 遍历二维 vector for (int i 0; i adj.size(); i) { for (int j 0; j adj[i].size(); j) { cout adj[i][j] ; } cout endl; }四、P1075 [NOIP 2012 普及组] 质因数分解 - 洛谷#include iostream using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(0), cin.tie(0); // 输入输出优化加快速度 ll n; cin n; // 遍历到 sqrt(n)找第一个能整除n的数较小质数 for (ll i 2; i * i n; i) { if (n % i 0) { cout n / i endl; // 输出较大质数 return 0; // 直接退出无需继续遍历 } } // 题目保证n是两个不同质数的乘积此处不会执行 return 0; }未解决P1009 [NOIP 1998 普及组] 阶乘之和 - 洛谷#includebits/stdc.h using namespace std; const int MAX_LEN 100; // 足够存储 50!...1!最多 65 位 // 高精度乘法将当前阶乘数组 a逆序乘以 x结果存回 a void mul(int a[], int len, int x) { int carry 0; // 进位 for (int i 0; i len; i) { int product a[i] * x carry; a[i] product % 10; // 当前位数字 carry product / 10; // 新的进位 } // 处理剩余进位可能新增位数 while (carry) { a[len] carry % 10; carry / 10; } } // 高精度加法将阶乘数组 a逆序长度 len_a累加到结果数组 sum逆序长度 len_sum void add(int sum[], int len_sum, int a[], int len_a) { int carry 0; // 进位 int max_len max(len_sum, len_a); for (int i 0; i max_len; i) { int s (i len_sum ? sum[i] : 0) (i len_a ? a[i] : 0) carry; sum[i] s % 10; // 当前位数字 carry s / 10; // 新的进位 } // 处理剩余进位 while (carry) { sum[len_sum] carry % 10; carry / 10; } } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin n; int sum[MAX_LEN] {0}; // 存储累加和逆序 int len_sum 1; // sum 的初始长度1 位数字 0 int fact[MAX_LEN] {0}; // 存储当前阶乘 i!逆序 int len_fact 1; fact[0] 1; // 初始0! 1迭代计算 1! 0!×12! 1!×2... for (int i 1; i n; i) { mul(fact, len_fact, i); // 计算 i! (i-1)! × i add(sum, len_sum, fact, len_fact); // 累加 i! 到 sum } // 逆序输出 sum从最高位到最低位 for (int i len_sum - 1; i 0; --i) { cout sum[i]; } cout \n; return 0; }long long的最大值仅为9.22×10^18约 9e181. 数组存储规则用int数组存储数字逆序排列例如123存储为[3,2,1]乘法时从最低位下标 0开始计算进位自然向高位下标增大方向传递无需调整数组加法时同样从最低位对齐避免高位补零的麻烦。2. 高精度乘法mul函数输入当前阶乘数组a逆序、数组长度len、乘数x当前的i逻辑遍历数组每一位计算当前位×x 进位当前位存余数%10进位存商/10处理剩余进位乘法可能新增位数如999×21998从 3 位变 4 位需将进位依次存入数组。3. 高精度加法add函数输入结果数组sum逆序、sum长度len_sum、阶乘数组a逆序、a长度len_a逻辑遍历到两个数组的最大长度计算sum当前位 a当前位 进位当前位存余数进位存商处理剩余进位加法可能新增位数如99921001需将进位存入sum数组。4. 迭代计算流程初始fact [1]表示0! 1sum [0]累加和初始为 0循环i1到nmul(fact, len_fact, i)将fact从(i-1)!更新为i!add(sum, len_sum, fact, len_fact)将i!累加到sum中输出逆序遍历sum数组从最高位下标len_sum-1到最低位下标 0输出结果。