C语言的经典问题以及它们的示例代码:
1. 水仙花数
```c
#include <stdio.h>
int main() {
int num, originalNum, remainder, n = 0;
printf("请输入一个三位数: ");
scanf("%d", &num);
originalNum = num;
while (originalNum != 0) {
remainder = originalNum % 10;
n = n * 10 + remainder;
originalNum /= 10;
}
if (n == originalNum)
printf("%d 是一个水仙花数。\n", num);
else
printf("%d 不是一个水仙花数。\n", num);
return 0;
}
```
2. **斐波那契数列** (递归实现)
```c
#include <stdio.h>
// 定义斐波那契数列的递归函数
unsigned int fibonacci(unsigned int n) {
if (n <= 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
int i, n = 10;
printf("The first %d Fibonacci numbers are:\n", n);
for (i = 0; i < n; i++) {
printf("%u ", fibonacci(i));
}
printf("\n");
return 0;
}
```
3. **杨辉三角**
```c
#include <stdio.h>
#include <stdlib.h>
void printTriangle(int n) {
int i, j, k;
// 为杨辉三角的每一行分配内存
int *triangle = (int *)malloc((n * (n + 1)) / 2 * sizeof(int));
// 打印上三角
for (i = 0; i < n; i++) {
for (j = 0; j < n - i; j++)
printf(" ");
for (k = 0; k <= i; k++) {
if (i == 0 || k == 0)
triangle[(i * (i + 1)) / 2 + k] = 1;
else
triangle[(i * (i + 1)) / 2 + k] = triangle[(i - 1) * i / 2 + k - 1] + triangle[k];
printf("%4d", triangle[(i * (i + 1)) / 2 + k]);
}
printf("\n");
}
// 释放内存
free(triangle);
}
int main() {
int n;
printf("Enter the number of rows: ");
scanf("%d", &n);
printTriangle(n);
return 0;
}
```
4. **汉诺塔问题** (递归实现)
```c
#include <stdio.h>
void hanoi(int n, char from_rod, char to_rod, char aux_rod) {
if (n == 1) {
printf("Move disk 1 from rod %c to rod %c\n", from_rod, to_rod);
return;
}
hanoi(n - 1, from_rod, aux_rod, to_rod);
printf("Move disk %d from rod %c to rod %c\n", n, from_rod, to_rod);
hanoi(n - 1, aux_rod, to_rod, from_rod);
}
int main() {
int n = 3; // Number of disks
hanoi(n, 'A', 'C', 'B'); // hanoi(n, source, destination, auxiliary)
return 0;
}
```
5. **回文数** (检查函数)
```c
#include <stdio.h>
#include <stdbool.h>
bool isPalindrome(int x) {
int n = 0;
int original = x;
if (x < 0) {
x = -x;
}
// 计算x的位数
while (x != 0) {
x = x / 10;
n++;
}
// 如果x是偶数位的,则直接进行比较
// 如果x是奇数位的,则进行比较前需要先去掉中间的数字
int rev = 0;
int temp = x;
while (n > 0) {
int pop = temp % 10;
rev = rev * 10 + pop;
temp = temp / 10;
n--;
}
if (original == rev) {
return true;
} else {
return false;
}
}
int main() {
int x = 121;
if (isPalindrome(x)) {
printf("%d 是一个回文数。\n", x);
} else {
printf("%d 不是一个回文数。\n", x);
}
return 0;
}
```
请注意,上述代码示例仅供参考,并且假设了输入的正确性。在实际的应用程序中,您可能需要添加额外的错误检查和边界条件处理。