大数相乘 - 推荐一个很好理解的博客
大数相乘
今天运气很好找到一个讲的很好的博客,谢谢你啦@静之吾心
易错点
- 数组的大小
- 数组的清零
- 前导0清除方法
大数相乘的规律
ans[i+j] = a[i] * a[j];
然后在进行进位处理,不停的累加到ans[i+j]上
然后也不用过多担心三位数以上,其实都是可以进位的不必要一下就处理完
代码分析
分为4部分
- 将字符串转化为数组,倒序存储
- 根据大数相乘的规律,得到对应位置上的结果
- 进位处理
- 删除前导0
- 最后将结果输出
博主的代码写的一气呵成,很容易理解,就是忘记清零了,haha
code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
char a[maxn],b[maxn];
int x[maxn+10],y[maxn+10],z[maxn*2+10];
int len1, len2;
int main(){
int i, j;
memset(a,0,sizeof a);
memset(b,0,sizeof b);
memset(x,0,sizeof x);
memset(y,0,sizeof y);
memset(z,0,sizeof z);
scanf("%s %s",a,b);
len1 = strlen(a);
len2 = strlen(b);
// cout << a << " " << b << endl;
for(j = 0 , i = len1-1; i>=0 ; i--)x[j++] = a[i] - '0';
for(j = 0 , i = len2-1; i>=0 ; i--)y[j++] = b[i] - '0';
for(i = 0 ; i < len1; i++){
for(j = 0 ; j < len2; j++){
z[i+j] = z[i+j] + x[i] * y[j];
}
}
for(int ii = 0 ; ii < maxn * 2; ii++){
if(z[ii] >= 10)
{
z[ii+1] = z[ii+1] + z[ii]/10;
z[ii] = z[ii] % 10;
}
}
// for(int k = 0 ; k < maxn ; k++){
// cout << z[k];
// }
// cout << endl;
for(i = maxn * 2; i>0;i--){ //删除前导0
if(z[i] == 0)
continue;
else
break;
}
for(; i>= 0; i--)
cout << z[i];
cout << endl;
return 0;
}
我明白一个道理
老师之前跟我谈话的时候就说到,当你无法前进的时候,你就要想一想,是因为什么导致了现在的状况,是因为知识点没有理解就开始敲代码,还是因为别的
这个其实很重要,比如这个大数相乘,如果你做过,看这类的代码那么就很流畅,很顺利,但是相反没有看过,很可能就被大数相乘这个名字吓到,所以说 知识点不够,没有记住,这个才是我的局限,所以并不是智商的差距,而是努力与不努力的差距
代码改变世界