笔算开2次方根、3次方根详细教程

本文详细介绍了如何使用笔算步骤开2次和3次方根,通过实例演示了从分级到试商的全过程,适合初学者快速入门。

今天呢来教大家如何用笔算开2次方根和3次方根(绝对能学会!!!)

2次方根

 比如我们有上图这样的一个式子,我们要开16384的平方根

首先,从右到左整数部分进行2位分级,小数部分从左到右进行分级

然后我们从左到右进行计算,先看最左边的一个分级,值为1,那就找出平方≤1的最大数,得出1

如图所示,1的平方得出1,对齐

 

 1-1=0,然后像做除法一样落下后面的数,我们落下一整个分级63

 这时候,我们把现在已经算出来的结果设为Q,和接下来要算的下一位结果设为n

 通过这个算式特出除数

Q*20+n

也就是说我们知道了除数为2开头的2位数,下图方框中的数就是经过这次计算后要得出的下一位结果,那就代入数字进行试商,我们发现这个数只能是2

 

所以我们得出: 

 

 以此类推进行下一步计算,落下下一个分级84

这时候的Q=12,除数是24开头的2位数 

 试商后得出8,余数为0,计算结束

最终的算式就是这样: 

 

 


3次方根

经过了刚刚的学习,我们了解了笔算开根号的过程,接下来学习3次方根的笔算就不会太难了! 

 

 

 

现在我们来对1860867开3次方根

首先,我们按分级的方法每3位分级

 

 

还是从左到右计算,找出立方≤1的最大数,得出1,然后算出余数,落下下一级

 

 

这时候,我们不需要计算除数

300Q^{2}n+30Qn^{2}+n^{3}

只需要根据上面公式,算出下一个位为2,得出728

然后继续算,得出下一个位为3,得出132867,余数为0,计算结束,得出结果为123


学会了吗?喜欢的话就点赞关注吧!

谢谢支持~ 

在C语言中实现高精度n方根,由于C语言的基本数据类型(如`int`、`long long`等)存在表示范围的限制,对于超出其范围的大数n方根,需要采用高精度算法。以下是一种实现思路及示例代码: ### 思路 1. **二分查找**:使用二分查找法来逼近n方根的结果。对于一个非负整数`x`,其n方根一定在区间`[0, x]`内。通过不断缩小这个区间,找到最接近真实n方根的结果。 2. **高精度计算**:在计算过程中,需要使用数组来存储大数,以处理超出基本数据类型范围的数值。 ### 示例代码 ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 // 高精度乘法 void multiply(int result[], int num, int len) { int carry = 0; for (int i = 0; i < len; i++) { int temp = result[i] * num + carry; result[i] = temp % 10; carry = temp / 10; } while (carry) { result[len++] = carry % 10; carry /= 10; } } // 高精度比较 int compare(int a[], int b[], int len_a, int len_b) { if (len_a != len_b) { return len_a - len_b; } for (int i = len_a - 1; i >= 0; i--) { if (a[i] != b[i]) { return a[i] - b[i]; } } return 0; } // 高精度n方根 void nth_root(int num[], int n, int result[], int *len_result) { int left[MAX_LEN] = {0}; int right[MAX_LEN] = {0}; int mid[MAX_LEN] = {0}; int temp[MAX_LEN] = {0}; // 初始化左右边界 right[0] = 1; int len_left = 1, len_right = 1, len_mid, len_temp; // 找到合适的右边界 while (1) { memcpy(temp, right, sizeof(right)); len_temp = len_right; for (int i = 1; i < n; i++) { multiply(temp, 10, len_temp); } if (compare(temp, num, len_temp, MAX_LEN) > 0) { break; } multiply(right, 10, len_right); len_right++; } // 二分查找 while (compare(left, right, len_left, len_right) <= 0) { // 计算中间值 len_mid = 0; int carry = 0; for (int i = MAX_LEN - 1; i >= 0; i--) { int sum = left[i] + right[i] + carry; mid[i] = sum / 2; carry = (sum % 2) * 10; if (mid[i] || len_mid) { len_mid++; } } // 计算中间值的n方 memcpy(temp, mid, sizeof(mid)); len_temp = len_mid; for (int i = 1; i < n; i++) { multiply(temp, 10, len_temp); } // 比较中间值的n方与原数 int cmp = compare(temp, num, len_temp, MAX_LEN); if (cmp <= 0) { memcpy(result, mid, sizeof(mid)); *len_result = len_mid; memcpy(left, mid, sizeof(mid)); len_left = len_mid; multiply(left, 10, len_left); len_left++; } else { memcpy(right, mid, sizeof(mid)); len_right = len_mid; multiply(right, 10, len_right); len_right--; } } } int main() { int num[MAX_LEN] = {2, 5}; // 示例:25 int n = 2; // 2方根 int result[MAX_LEN] = {0}; int len_result = 0; nth_root(num, n, result, &len_result); // 输出结果 for (int i = len_result - 1; i >= 0; i--) { printf("%d", result[i]); } printf("\n"); return 0; } ``` ### 代码解释 1. **`multiply`函数**:实现高精度乘法,将一个数组表示的大数乘以一个整数。 2. **`compare`函数**:比较两个高精度数的大小。 3. **`nth_root`函数**:使用二分查找法逼近n方根的结果。 4. **`main`函数**:初始化待方的数和方数,调用`nth_root`函数计算结果,并输出结果。 ### 复杂度分析 - **时间复杂度**:二分查找的时间复杂度为$O(log x)$,其中$x$是待方的数。每计算中间值的n方需要$O(n * m)$的时间,其中$m$是高精度数的位数。因此,总的时间复杂度为$O(n * m * log x)$。 - **空间复杂度**:主要用于存储高精度数,空间复杂度为$O(m)$。 ### 注意事项 - 代码中的数组长度`MAX_LEN`可以根据实际需求进行调整。 - 代码只处理非负整数的n方根,对于负数或小数的情况需要进行额外处理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值