许多C++经典算法,方便学习和应用.
1、打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153 = 13 + 53 + 33。 */
根据给定文件的信息,我们可以总结出以下几个C++经典算法知识点:
### 1. 打印出所有的“水仙花数”
**定义与解释:**
水仙花数(Narcissistic number)指的是一个三位数,它的各个位上的数字立方和等于它本身。例如,153 是一个水仙花数,因为 153 = 1³ + 5³ + 3³。
**实现代码解析:**
```cpp
#include <iostream>
using namespace std;
void main() {
int i, a, b, c;
for (i = 100; i < 1000; i++) { // 遍历所有三位数
a = i % 10; // 获取个位数
b = i / 10 % 10; // 获取十位数
c = i / 100 % 10; // 获取百位数
if (a * a * a + b * b * b + c * c * c == i) {
cout << "i=" << i << endl;
}
}
}
```
**核心逻辑:**
- 使用循环遍历100到999之间的所有数字。
- 对每个数字进行拆分,分别获取百位、十位和个位。
- 检查这个数字是否等于其各位数字立方和。
- 如果条件成立,则输出该数字。
### 2. 完美数检测
**定义与解释:**
完美数(Perfect number)是指一个正整数,它等于除自身之外的所有正因子之和。例如,6 的因子为 1、2 和 3,而 1 + 2 + 3 = 6,所以 6 是一个完美数。
**实现代码解析:**
```cpp
#include <iostream>
using namespace std;
void main() {
int i, j, sum = 0, a[50], k = 0, t;
for (i = 1; i <= 1000; i++) {
sum = 0;
for (j = 1; j < i; j++) {
if (i % j == 0) {
sum += j;
a[k++] = j;
}
}
t = k;
if (sum == i) {
cout << i << "->";
for (k = 0; k < t; k++) {
cout << a[k];
if (k < t - 1) cout << ",";
}
cout << endl;
}
k = 0;
}
}
```
**核心逻辑:**
- 对于每一个数 i,在 1 到 i-1 的范围内找到所有能整除 i 的数,并将它们累加起来。
- 如果累加的结果正好等于 i,那么 i 就是一个完美数。
- 输出完美数及其所有因子。
### 3. 数列求和问题
**定义与解释:**
对于给定的 a 和 n,计算序列 `a + aa + aaa + ... + a...a (n 个 a)` 的值。例如,当 a = 2, n = 5 时,序列是 2 + 22 + 222 + 2222 + 22222。
**实现代码解析:**
```cpp
#include <iostream>
using namespace std;
void main() {
double a, sn = 0.0, sum = 0.0;
int n, i;
cout << "please input a number ";
cin >> a;
cout << "please input n number ";
cin >> n;
sn = a;
sum = a;
for (i = 2; i <= n; i++) {
sum = sum * 10 + a;
sn += sum;
}
cout << "Sn=" << sn << endl;
}
```
**核心逻辑:**
- 用户输入 a 和 n。
- 初始化 `sum` 为 a。
- 使用循环逐步构建每个项,并累加到 `sn` 中。
- 输出最终结果 `sn`。
### 4. 球弹跳问题
**定义与解释:**
有一个球从 100 米的高度自由落下。每次落地后反跳回原高度的一半;再落下,求它在第 10 次落地时,共经过多少米?第 10 次反弹多高?
**实现代码解析:**
```cpp
#include <iostream>
using namespace std;
void main() {
double h1 = 100, h2 = 100, sum = 0.0;
int i;
for (i = 1; i <= 10; i++) {
sum += h2;
h1 = h1 / 2.0;
h2 = h1 * 2;
}
cout << "sum=" << sum << " " << "h1=" << h1 << endl;
}
```
**核心逻辑:**
- 初始化 `h1` 和 `h2` 为 100 米。
- 在每次循环中更新高度,并累加总路程。
- 输出经过的总路程以及第 10 次反弹的高度。
### 5. 数列翻倍问题
**定义与解释:**
有 10 只兔子,每过一个月,每只兔子都会翻倍。求 10 个月后有多少只兔子。
**实现代码解析:**
```cpp
#include <iostream>
using namespace std;
void main() {
int number, i;
number = 1;
for (i = 10; i > 1; i--) {
number = (number + 1) * 2;
}
cout << "number=" << number << endl;
}
```
**核心逻辑:**
- 初始化 `number` 为 1。
- 从 10 开始递减计数,每经过一个月,兔子数量翻倍。
- 输出 10 个月后的兔子总数。
通过以上分析,我们可以清晰地理解这些经典算法的定义、用途以及其实现方法。这些算法不仅是 C++ 编程中的基础练习,也是理解和掌握编程思想的重要途径。