编程练习:探索数学问题的编程解决方案 P137
文章目录
- 1. 最大公约数和最小公倍数
- 2. 水仙花数
- 3. 完数
- 4. 自由落体球
- 5. 猴子吃桃问题
- 6. 寻找素数
1. 最大公约数和最小公倍数
问题描述:给定两个正整数m和n,求它们的最大公约数(GCD)和最小公倍数(LCM)。
代码实现:
#include <stdio.h>
// 函数:求最大公约数
int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
// 函数:求最小公倍数
int lcm(int a, int b) {
return (a / gcd(a, b)) * b; // 使用 GCD 计算 LCM
}
int main() {
int m, n;
printf("请输入两个正整数 m 和 n:");
scanf("%d %d", &m, &n);
printf("最大公约数: %d\n", gcd(m, n));
printf("最小公倍数: %d\n", lcm(m, n));
return 0;
}
2. 水仙花数
问题描述:一个三位数,其各位数字的立方和等于该数本身。
代码实现:
#include <stdio.h>
int main() {
int num, hundreds, tens, units;
printf("1000以内的水仙花数有:\n");
for (num = 100; num < 1000; num++) {
// 分解每个三位数的各位数字
hundreds = num / 100; // 百位
tens = (num / 10) % 10; // 十位
units = num % 10; // 个位
// 计算立方和
if (hundreds * hundreds * hundreds +
tens * tens * tens +
units * units * units == num) {
printf("%d\n", num);
}
}
return 0;
}
3. 完数
问题描述:一个数如果恰好等于它的因子之和,这个数就称为“完数”。
代码实现:
#include <stdio.h>
// 函数用于找出一个数的所有因子并判断是否为完数
void findPerfectNumbers(int limit) {
for (int num = 1; num < limit; num++) {
int sum = 0; // 用于存储因子之和
// 找出num的所有因子
for (int i = 1; i <= num / 2; i++) {
if (num % i == 0) {
sum += i;
}
}
// 如果因子之和等于原数,说明是完数
if (sum == num) {
printf("%d its factors are", num);
// 输出完数的所有因子
for (int i = 1; i <= num / 2; i++) {
if (num % i == 0) {
if (i == 1) {
printf(" %d", i); // 第一个因子前不加逗号
} else {
printf(",%d", i); // 之后的因子前加逗号
}
}
}
printf(".\n"); // 换行
}
}
}
int main() {
int limit = 1000; // 定义上限为1000
printf("1000之内的完数及其因子如下:\n");
findPerfectNumbers(limit);
return 0;
}
4. 自由落体球
问题描述:一个球从100m高度自由落下,每次落地后反弹回原高度的一半。
代码实现:
#include <stdio.h>
int main() {
double height = 100; // 初始高度为100米
double totalDistance = 0; // 总经过的距离初始化为0
double reboundHeight = 0; // 第10次反弹的高度初始化为0
// 循环计算每次落地和反弹的距离,直到第10次落地
for (int i = 0; i < 10; i++) {
totalDistance += height; // 累加每次下落的距离
height /= 2; // 每次落地后反弹的高度是上次高度的一半
if (i < 9) {
totalDistance += height; // 除了最后一次落地,每次落地后还要加上反弹的距离
}
}
// 计算第10次反弹的高度
reboundHeight = height / 2;
// 输出总经过的距离和第10次反弹的高度
printf("第10次落地后总共经过的距离:%.2f米\n", totalDistance);
printf("第10次反弹的高度:%.2f米\n", reboundHeight);
return 0;
}
5. 猴子吃桃问题
问题描述:猴子第1天摘下若干个桃子,每天吃掉一半再加一个。
代码实现:
#include <stdio.h>
int main() {
int peaches = 1; // 第10天剩下的桃子数
for (int day = 10; day > 1; day--) {
peaches = (peaches + 1) * 2; // 逆推前一天的桃子数
}
printf("第1天共摘了%d个桃子。\n", peaches);
return 0;
}
6. 寻找素数
问题描述:求100~1000的全部素数。
代码实现:
#include <stdio.h>
#include <math.h>
int main() {
int i, j, flag, count = 0; // 添加计数器count
for (i = 100; i <= 1000; i++) {
flag = 1; // 假设i是素数
for (j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
flag = 0; // 如果i能被j整除,则i不是素数
break;
}
}
if (flag) {
printf("%d ", i);
count++; // 输出一个素数后计数器加1
if (count % 5 == 0) { // 每输出五个素数换一行
printf("\n");
}
}
}
if (count % 5 != 0) { // 如果最后一行不足五个数,也要换行
printf("\n");
}
return 0;
}