Loading... ## 补充: 我们的高精度是指已经超过了整形的字节范围,越域了; 低精度是指没有超过整形字节的范围,通俗来说就是能够正常进行运算的数字 ## 思路: 嗯嗯嗯!我们可以这么想,我们是不是高精度除以低精度嘛!我们直接用高精度的最高位除以低精度,如果除不了的话,我们商一个0;然后我们取高精度除以低精度的余数,我们把这个余数 乘以 10,然后加上最高位的下一位,接着用这个数去除以低精度;以此类推。 ## 细节: <div class="tip inlineBlock error"> 对于商的最高位,我们如何判断呢? </div> <div class="tip inlineBlock success"> 我们要知道一个大的数去除以一个小的数,最后的商的最高位肯定不会超过大的那个数的最高位的,所以我们商的最高位设置为大的数的最高位;还有一个我们要知道最低位的最后一个数是不可能等于0的,所以我们只需要使用while去0法,去掉商的前导0即可。 </div> ## 代码: ```cpp #include<stdio.h> #include<string.h> #define MAX 100 //预定义 MAX为 100 int main() { char str[MAX]; int str_1[MAX] = {0}, str_2[MAX] = {0}; long long str_3; int i, j, k, flag = 0, str_len, sum; scanf("%s", str);//高精度输入 str_len = strlen(str);//商的最高位 scanf("%ld", &str_3);//低精度输入 for(i = 0; i < str_len; i++)//字符转换整形 { str_1[i] = str[i] - '0'; } for(i = 0; i < str_len; i++) { str_2[i] = (flag * 10 + str_1[i]) / str_3;//用高精度的最高位除以低精度 flag = (flag * 10 + str_1[i]) % str_3;//所求余数用于最高位的下一位运算 } j = 0; while(j < str_len && str_2[j] == 0) j++;//while去前导0 for(j; j < str_len; j++) { printf("%d", str_2[j]); } return 0; } ``` . ## c++模板: ```cpp vector<int> div(vector<int> &A, int b, int &r) { vector<int> C; r = 0; for (int i = A.size() - 1; i >= 0; i -- ) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } reverse(C.begin(), C.end()); while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } ``` 最后修改:2022 年 03 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。