135829m 2022-08-18 18:53 采纳率: 75%
浏览 175
已结题

C语言 高精度计算部分

img

img

img

务必C语言 需要高精度计算处理 后面我想法是第一个循环向后覆盖 请教高精度部分代码!或者完整代码!本人基础较弱 请附适当注释

  • 写回答

4条回答 默认 最新

  • 斗迷飞鸟 2022-08-19 17:05
    关注

    (1)用短整型数组存储大整数,并定义相关的结构体和函数

    #include <math.h>
    #include <stdio.h>
    #include <stdbool.h>
    #include <string.h>
    
    //基于短整型数组定义大整数结果,数组的每一个分量对应大整数的一位
    struct big_int_struct
    {
        short int int_arr[100001];  //第一个分量对应大整数的最低位
        int digit_num;
    };
    //通过大整数字符串给大整数对应的短整型数组赋值
    struct big_int_struct str2big_int(char *str)
    {
        struct big_int_struct big_int_obj;
        int digit_num = (int)strlen(str);
        big_int_obj.digit_num = digit_num;
        int i;
        for (i = 0; i < digit_num; i++)
        {
            big_int_obj.int_arr[i] = str[digit_num - 1 - i] - '0';
        }
        return big_int_obj;
    }
    //处理短整型数组的分量大于10的情形
    void norm_big_int(struct big_int_struct *big_int_ptr)
    {
        int i;
        for (i = 0; i < big_int_ptr->digit_num; i++)
        {
            big_int_ptr->int_arr[i + 1] += big_int_ptr->int_arr[i] / 10;
            big_int_ptr->int_arr[i] %= 10;
        }
        if (big_int_ptr->int_arr[big_int_ptr->digit_num] != 0)
        {
            big_int_ptr->digit_num++;
        }
    }
    //比较两个大整数
    int cmp_big_int(struct big_int_struct *big_int_a_ptr, struct big_int_struct *big_int_b_ptr)
    {
        int a_digit_num = big_int_a_ptr->digit_num;
        int b_digit_num = big_int_b_ptr->digit_num;
        if (a_digit_num > b_digit_num) { return 1; }
        if (a_digit_num < b_digit_num) { return -1; }
        int i;
        for (i = a_digit_num - 1; i >= 0; i--)
        {
            if (big_int_a_ptr->int_arr[i] > big_int_b_ptr->int_arr[i]) { return 1; }
            if (big_int_a_ptr->int_arr[i] < big_int_b_ptr->int_arr[i]) { return -1; }
        }
        return 0;
    }
    //判断是否大整数的所有位都等于9
    bool judge_all_digits_nine(struct big_int_struct *big_int_ptr)
    {
        int i;
        for (i = 0; i < big_int_ptr->digit_num - 1; i++)
        {
            if (big_int_ptr->int_arr[i] != 9)
            {
                return false;
            }
        }
        return true;
    }
    //打印大整数
    void print_big_int(struct big_int_struct *big_int_ptr)
    {
        int i;
        for (i = big_int_ptr->digit_num - 1; i >= 0; i--)
        {
            printf("%d", big_int_ptr->int_arr[i]);
        }
        printf("\n");
    }
    

    (2)问题的C语言解决代码

    int main()
    {
        //初始化
        int L;
        char A_str[100000];
        scanf("%d", &L);
        scanf("%s", &A_str);
        int A_digit_num = (int)strlen(A_str);
        int i;
    
        //构造大整数结构对象
        struct big_int_struct big_int_A = str2big_int(A_str);
        struct big_int_struct big_int_result, big_int_tmp;
    
        //找到大于A且有长度L循环节的最小整数
        int cycle_section_num = (A_digit_num + L - 1) / L;
        if (A_digit_num%L == 0) //处理A_digit_num能被L整除的情形
        {
            big_int_tmp.digit_num = A_digit_num;
            for (i = 1; i <= cycle_section_num; i++)
            {
                memcpy(&(big_int_tmp.int_arr[big_int_tmp.digit_num - i*L]),
                    &(big_int_A.int_arr[big_int_A.digit_num - L]),
                    L * sizeof(big_int_tmp.int_arr[0]));
            }
            if (cmp_big_int(&big_int_tmp, &big_int_A) > 0)
            {
                big_int_result = big_int_tmp;
            }
            if (cmp_big_int(&big_int_tmp, &big_int_A) <= 0)
            {
                if (judge_all_digits_nine(&big_int_A))
                {
                    big_int_result.digit_num = L*(cycle_section_num + 1);
                    for (i = 1; i <= cycle_section_num + 1; i++)
                    {
                        big_int_result.int_arr[i*L - 1] = 1;
                    }
                }
                else
                {
                    big_int_result = big_int_A;
                    big_int_result.int_arr[big_int_result.digit_num - L] += 1;
                    for (i = 2; i <= cycle_section_num; i++)
                    {
                        memcpy(&(big_int_result.int_arr[big_int_result.digit_num - i*L]),
                            &(big_int_result.int_arr[big_int_result.digit_num - L]),
                            L * sizeof(big_int_result.int_arr[0]));
                    }
                }
            }
        }
        else //处理A_digit_num不能被L整除的情形
        {
            big_int_result.digit_num = L*cycle_section_num;
            for (i = 1; i <= cycle_section_num; i++)
            {
                big_int_result.int_arr[i*L - 1] = 1;
            }
        }
    
        //输出结果
        norm_big_int(&big_int_result); //处理大整数对应短整数数组中存在大于10的分量的情形
        print_big_int(&big_int_result);
    
        return 0;
    }
    

    (3)代码运行结果截图
    运行结果1:

    img


    运行结果2:

    img


    运行结果3:

    img


    运行结果4:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 赞助了问题酬金5元 8月18日
  • 创建了问题 8月18日

悬赏问题

  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序