综述由AI生成系统介绍了 C++ 编程语言的基础知识与常用算法。内容涵盖 for 与 while 循环结构、函数模块化设计、结构体定义与嵌套、字符串处理、ASCII 码应用。深入讲解了递归原理、回溯法模板及高精度整数加减法的模拟实现。通过斐波那契数列、数根计算、全排列枚举等经典例题,帮助读者掌握 C++ 核心语法与算法思维,适合编程初学者入门与巩固。
性能调优28 浏览
C++ 基础教程:从 For 循环到算法初步
for 循环计数器
for (int i = 1; i <= n; i++) {
// 定义计数变量,判断结束条件,执行动作
}
示例
#include<iostream>usingnamespace std;
intmain(){
int n;
cin >> n;
int cnt = 0;
for (int i = 1; i <= n; i++) {
cnt++;
}
cout << cnt;
return0;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// 可叠层使用
}
}
练习题目:饲料调配
题目描述
给定三种饲料的营养成分及需求,求满足需求的饲料组合数量。
代码实现
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespace std;
typedeflonglong LL;
intmain(){
int a, b, c;
cin >> a >> b >> c;
int a1, b1, c1;
cin >> a1 >> b1 >> c1;
int a2, b2, c2;
cin >> a2 >> b2 >> c2;
int a3, b3, c3;
cin >> a3 >> b3 >> c3;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
for (int k = 0; k < 100; k++) {
if (!i && !j && !k) continue;
int x = a1 * i + a2 * j + a3 * k;
int y = b1 * i + b2 * j + b3 * k;
int z = c1 * i + c2 * j + c3 * k;
if (x * b == y * a && y * c == b * z && x % a == 0) {
cout << i << " " << j << " " << k << " " << x / a << endl;
return0;
}
}
}
}
cout << "NONE";
return0;
}
#include<iostream>usingnamespace std;
intgcd(int a, int b){
if (a % b == 0) {
return b;
} else {
returngcd(b, a % b);
}
}
intmain(){
int a, b;
cin >> a >> b;
cout << gcd(a, b) << endl;
return0;
}
回溯法
回溯法是一种试错过程,当发现当前路径不可行时回退到上一步选择其他分支。
模板:全排列枚举
#include<iostream>usingnamespace std;
bool vis[10];
int plan[10];
int n;
voiddfs(int step){
if (step == n + 1) {
for (int i = 1; i <= n; i++) {
cout << plan[i] << " ";
}
cout << endl;
return;
}
for (int i = 1; i <= n; i++) {
if (vis[i]) continue;
plan[step] = i;
vis[i] = true;
dfs(step + 1);
vis[i] = false;
}
}
intmain(){
cin >> n;
dfs(1);
return0;
}
高精度算法
加法
模拟竖式加法,逆序存储数组以方便处理进位。
#include<iostream>#include<string>#include<algorithm>usingnamespace std;
voids2BIG(string s, int a[]){
a[0] = s.size();
for (int i = 1; i <= a[0]; i++) {
a[i] = s[a[0] - i] - '0';
}
}
voidprintBIG(int a[]){
for (int i = a[0]; i >= 1; i--) {
cout << a[i];
}
cout << endl;
}
voidaddBIG(int a[], int b[], int c[]){
c[0] = max(a[0], b[0]);
int u = 0;
for (int i = 1; i <= c[0]; i++) {
int t = a[i] + b[i] + u;
c[i] = t % 10;
u = t / 10;
}
if (u > 0) {
c[++c[0]] = u;
}
}
int a[1000005], b[100005], c[100005];
string sa, sb;
intmain(){
cin >> sa >> sb;
s2BIG(sa, a);
s2BIG(sb, b);
addBIG(a, b, c);
printBIG(c);
return0;
}
减法
原理同加法,将进位改为退位,并需比较两数大小。
#include<iostream>#include<string>#include<algorithm>usingnamespace std;
// ... (省略部分辅助函数,逻辑同上)boolcmpBIG(int a[], int b[]){
if (a[0] != b[0]) return a[0] < b[0];
for (int i = a[0]; i >= 1; i--)
if (a[i] != b[i]) return a[i] < b[i];
returnfalse;
}
voidsubBIG(int a[], int b[], int c[]){
c[0] = max(a[0], b[0]);
int u = 0;
for (int i = 1; i <= c[0]; i++) {
int t = a[i] - b[i] - u;
if (t < 0) {
c[i] = t + 10;
u = 1;
} else {
c[i] = t;
u = 0;
}
}
while (c[c[0]] == 0 && c[0] > 1) c[0]--;
}
int a[1005], b[1005], c[1005];
string sa, sb;
intmain(){
cin >> sa >> sb;
s2BIG(sa, a);
s2BIG(sb, b);
if (cmpBIG(a, b)) subBIG(b, a, c);
elsesubBIG(a, b, c);
printBIG(c);
return0;
}