完整代码
#include <inttypes.h> // 引用头文件inttypes.h,以便调用strtoumax函数
#include <stdio.h> // 引用头文件stdio.h,以便调用printf、scanf和putchar函数
#include <unistd.h> // 引用头文件unistd.h,以便调用system函数
/*
* 定义一个函数m_isdigit,用以判断函数参数c这个字符是否是数字字符
*
* @param c 需要判断是否是数字字符的字符
*/
int m_isdigit(char c) {
char number_chars[] = "0123456789"; // 定义一个字符串变量,这个字符串变量包含着所有数字字符
for (char *each_number_char = &number_chars[0]; // 通过for循环判断字符c是否在字符串number_chars中,如果在,则说明字符c是一个数字字符
*each_number_char != '\0'; // 在未到达字符串number_chars末尾时进行循环
each_number_char++) { // 每一次循环把字符指针each_number_char加1,以便下一次循环判断字符串number_chars中的下一个字符是否等于c
if (*each_number_char == c) { // 在c等于当前循环到的字符指针each_number_char所指向的字符时,函数返回1,表示字符c是一个数字字符
return 1; // 函数返回1
} // if (*each_number_char == c)
} // for (char *each_number...
return 0; // 在number_chars中所有字符都不等于函数参数c时返回0,表示字符c不是一个数字字符
}
/*
* 定义一个函数is_digits,用以判断函数参数str这个字符串的每一个字符是否都是数字字符
*
* @param str 需要判断字符串中每一个字符都是数字字符的那个字符串
*/
int is_digits(char *str) {
if (*str == '\0') { // 在字符串为空符串时返回0
return 0; // 返回0
} // if (*str == '\0')
for (char *each_char = &str[0]; // 通过for循环调用函数m_isdigit判断字符串str中每一个字符是否不是数字字符
*each_char != '\0'; // 在未到达字符串str末尾时进行循环
each_char++) { // 每一次循环把字符指针each_char加1,以便下一次循环判断字符串str中的下一个字符是否是数字字符
if (!m_isdigit(*each_char)) { // 在调用函数m_isdigit判断当前在判断的字符指针each_char所指向的字符不是一个数字字符时,函数返回0,表示字符串str中的字符不都是数字字符
return 0; // 函数返回0
} // if (!m_isdigit(* each_char))
} // for (char *each_char...
return 1; // 当字符串str中所有字符都通过判断,没有一个字符不是数字字符,那么可以判断str这个字符串中的字符都是数字字符
}
int (*is_str_positive_number)(char *) = is_digits; // 以判断每一个字符都是数字字符,大致判断一个字符串是正整数字符串
/*
* 定义一个函数is_triangle_edges,判断三个边长是否可以构成一个三角形
*
* @param a 作为三角形的一边的长度
* @param b 作为三角形的一边的长度
* @param c 作为三角形的一边的长度
*/
int is_triangle_edges(uintmax_t a, uintmax_t b, uintmax_t c) {
return a + b > c; // 三条边的任意两边大于第三边的三条边首尾相连可构成一个三角形
}
/*
* 定义一个函数is_rt,判断三个边长是否可以构成一个直角三角形
*/
int is_rt(uintmax_t a, uintmax_t b, uintmax_t c) {
return a * a + b * b == c * c; // 勾股定理,判断三个边长是否可以构成一个直角三角形
}
/*
* 定义一个函数is_left_equal_sorted,判断a <= b < c是否成立
*
* @param a 一个正整数
* @param b 一个正整数
* @param c 一个正整数
*/
int is_left_equal_sorted(uintmax_t a, uintmax_t b, uintmax_t c) {
return a <= b && b < c; // 判断a <= b < c是否成立,并返回判断的结果
}
/*
* 主函数
*/
int main() {
system("chcp 65001"); // 把控制台字符编码换成UTF-8,以免出现控制台中文乱码的现象
char info[] =
"请您输入一个正整数,作为计算整数勾股数的范围:";// 提示用户输入正整数的提示信息
char input_context[64] = {0}; // 容纳用户输入内容的字符数组
uintmax_t upper_limit; // 存储转换后的无符号整数
while (!is_str_positive_number(input_context)) {// 在用户输入内容字符串input_context不是一个正整数时进行循环
putchar('\n'); // 输出换行符
printf("%s", info); // 输出提示信息,提示用户输入一个正整数,作为计算整数勾股数的范围
scanf("%s", input_context); // 把用户输入的内容存储到字符数组input_context中
}
upper_limit = strtoumax(input_context, // 在用户输入的内容是一个正整数时停止循环,把用户输入的内容转化为无符号整数类型
NULL, // 以NULL为终止指针
10); // 以十进制进行解析
for (uintmax_t i = 1; // 使变量i在区间(1, upper_limit)递增,步长为1
i <= upper_limit;
i++) {
for (uintmax_t j = 1; // 使变量j在区间(1, upper_limit)递增,步长为1
j <= upper_limit;
j++) {
for (uintmax_t k = 1; // 使变量k在区间(1, upper_limit)递增,步长为1
k <= upper_limit;
k++) {
if (is_left_equal_sorted // 当i <= j < k成立时,三边已从大到小排序,再进一步判断,
(i, j, k) && // 这一步自动排除了重复的勾股数
is_triangle_edges(i, j, k) // 判断三条边i, j, k是否能构成一个三角形
&& is_rt(i, j, k)) { // 判断三条边i, j, k是否能构成一个直角三角形
printf("%llu %llu %llu\n",
i, j, k); // 在三个条件都成立时输出勾股数
}
}
}
}
system("pause"); // 暂停以便查看控制台输出
return 0; // 最后主函数返回0以表示程序正常退出
}
运行结果