Loading... 刚开始的时候有点蒙,打练两把王者,瞬间脑袋瓜子神清气爽。 ## 思路: 对于乘法我们肯定不陌生,乘法是不是一个数 乘以 另一个数的个位,接着 乘以 十位,百位...,然后错位相加。 ## 细节: <div class="tip inlineBlock error"> 最高位是多少? </div> <div class="tip inlineBlock success"> 相乘后的最高位不会超过两个数最高位相加之和。最后我们再用while去0,就可以控制两数相乘最后最终的最高位了 </div> <div class="tip inlineBlock error"> 关于相乘后如何错位相加呢? </div> <div class="tip inlineBlock success"> 我们写两个for循环,通过for循环来控制错位相加。 </div> <div class="tip inlineBlock error"> 进位? </div> <div class="tip inlineBlock success"> 其实进位和我们的高精度加法/减法一样,利用 `和 % 10`赋值, 利用 `和 / 10`进位 </div> ## 代码: ```cpp #include<stdio.h> #include<string.h> #define MAX 100 //预定义 MAX为 100 int main() { int str1[MAX] = {0}, str2[MAX] = {0}, str3[MAX] = {0}; char str11[MAX], str22[MAX]; int str1_num, str2_num, i, j, k, n, flag = 0, sum; scanf("%s", str11); str1_num = strlen(str11); for(i = 0; i < str1_num; i++) { str1[i] = str11[str1_num - 1 - i] - '0';//反向遍历转换整形,赋值数组1 } scanf("%s", str22); str2_num = strlen(str22); for(i = 0; i < str2_num; i++) { str2[i] = str22[str2_num - 1 - i] - '0';//反向遍历转换整形,赋值数组2 } n = str1_num + str2_num;//两数相乘后最高位(不会超过两数的最高位之和 ) for(i = 0; i < str2_num; i++) { flag = 0; //首先进位为0 for(j = 0; j < str1_num; j++) { sum = str1[i] * str2[j] + flag + str3[i + j];//str1[i] * str2[j] 相信大家很容易理解,后面的那个str3[i + j]的作用是加上前一位遍历相乘的值 str3[i + j] = sum % 10;//str3[i + j]错位赋值的关键所在 ,当i = 0时,先用个位乘以另一个数的所有位,并且赋值给数组; flag = sum / 10; //当 i = 1时,我们的 i + j是不是相对于上一次的 i + j 多了一个 1,这就达到了我们错位的目的 } str3[i + j] += flag; //为了防止最后进位,我们得在遍历结束后对 (最高位 + 1)位 进行赋值进位 } while(n > 0 && str3[n-1] ==0) n--; //while去 0,防止最后的高位为0 for (i = 0; i < n; i++) { printf("%d", str3[n - 1 - i]); } return 0; } ``` ## c++模板: ```cpp vector<int> mul(vector<int> &A, int b) { vector<int> C; int t = 0; for (int i = 0; i < A.size() || t; i ++ ) { if (i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } ``` 最后修改:2022 年 03 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果文章有用,请随意打赏。