C语言计算整数勾股数

4 篇文章 0 订阅
1 篇文章 0 订阅

完整代码

#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以表示程序正常退出
}

运行结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值