// 函数 sort:用于对三个数 a, b, c 进行排序,使它们按从小到大的顺序排列 //只需要知道,这个函数会将我们输入的三个数字 从小到大排序 voidsort(int *x, int *y, int *z) { // 如果 x 比 y 大,则交换 x 和 y 的值 if (*x > *y) { int temp = *x; // 临时保存 x 的值 *x = *y; // 将 y 的值赋给 x *y = temp; // 将原来的 x 的值赋给 y } // 如果 x 比 z 大,则交换 x 和 z 的值 if (*x > *z) { int temp = *x; // 临时保存 x 的值 *x = *z; // 将 z 的值赋给 x *z = temp; // 将原来的 x 的值赋给 z } // 如果 y 比 z 大,则交换 y 和 z 的值 if (*y > *z) { int temp = *y; // 临时保存 y 的值 *y = *z; // 将 z 的值赋给 y *z = temp; // 将原来的 y 的值赋给 z } }
// 函数功能:用于对三角形进行分类 // 参数 a, b, c 表示三角形的三条边 //只需要知道,这个函数是判断三角型类型的,判断原理就是 三角形的三边关系 voidclassify_triangle(int a, int b, int c) { sort(&a, &b, &c); // 调用 sort 函数对 a, b, c 进行排序,使 a <= b <= c
// 检查是否能构成三角形(两边之和必须大于第三边) if (a + b <= c) { printf("Not triangle\n"); // 如果不能构成三角形,输出 "Not triangle" return; // 直接结束函数 }
// 如果三条边相等,则是等边三角形(等边三角形也是锐角三角形和等腰三角形) if (a == b && b == c) { printf("Acute triangle\n"); // 等边三角形是锐角三角形 printf("Isosceles triangle\n"); // 也是等腰三角形 printf("Equilateral triangle\n"); // 是等边三角形 return; // 直接结束函数 }
// 计算每条边的平方,方便后面判断三角形类型 int a2 = a * a, b2 = b * b, c2 = c * c;
// 遍历所有奇数从 3 到 sqrt(n),检查 n 是否能被这些数整除 for (int i = 3; i * i <= n; i += 2) { // 如果 n 能被某个奇数整除,则不是质数,返回 0 if (n % i == 0) return0; } // 如果循环结束,没有发现任何整除因子,则 n 是质数,返回 1 return1; }
intmain() { int L; // 存储用户输入的上限 L scanf("%d", &L); // 从用户输入中读取 L 的值 int sum = 0, count = 0; // 初始化两个变量:sum 用于存储质数的和,count 记录质数的个数
// 从 2 开始逐个检查质数,直到质数的和超过 L for (int i = 2; sum + i <= L; i++) // 注意sum + i不会进行赋值,只会进行判断,如果加上下一个数字超出了L,那么循环就执行完毕 { // 检查 i 是否为质数 if (is_prime_num(i)) { sum += i; // 将质数 i 加到 sum 中 printf("%d\n", i); // 输出当前找到的质数 count++; // 质数计数器加 1 } }
// 输出总共找到的质数个数 printf("%d\n", count); return0; }
质数判断函数 is_prime_num:
对于输入的整数 n,首先排除掉所有小于等于1的数(它们都不是质数)。
直接判断2是否是质数(2是唯一的偶数质数)。
对于大于2的偶数,直接返回0(它们都不是质数)。
然后,只需检查奇数因子是否能整除 n,因为偶数已经被排除。检查的范围是从3到 sqrt(n),因为如果 n 能被大于 sqrt(n) 的数整除,必然也能被某个小于 sqrt(n) 的数整除。
intmain() { int l, m; // l 表示路的长度(从 0 到 l 共 l+1 米),m 表示需要砍树的区间数量 int trees[MAX_LENGTH] = {0}; // 定义一个数组来表示每米是否有树,初始化为 0 int u, v, remaining_trees = 0; // u 和 v 表示每次要砍掉树的区间,remaining_trees 记录剩余的树的数量 int i, j; // 循环变量
// 读取路的长度 l 和砍树区间的数量 m scanf("%d %d", &l, &m);
// 初始化所有的位置为 1,表示每米上都有树 for (i = 0; i <= l; i++) { trees[i] = 1; // 1 表示这米有树 }
// 循环读取每个需要砍树的区间 [u, v] for (i = 0; i < m; i++) { scanf("%d %d", &u, &v); // 读取砍树的起点 u 和终点 v // 将区间 [u, v] 中的树标记为 0,表示这些树被砍掉 for (j = u; j <= v; j++) { trees[j] = 0; // 0 表示该米的树被砍掉 } }
// 遍历所有位置,计算还剩多少棵树 for (i = 0; i <= l; i++) { if (trees[i] == 1) { // 如果该位置的树没有被砍掉 remaining_trees++; // 剩余树的数量加 1 } }