务必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:
运行结果2:
运行结果3:
运行结果4:
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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的三轴机械手程序