大数相乘 - 推荐一个很好理解的博客

大数相乘

今天运气很好找到一个讲的很好的博客,谢谢你啦@静之吾心

易错点

  • 数组的大小
  • 数组的清零
  • 前导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;
}

我明白一个道理

老师之前跟我谈话的时候就说到,当你无法前进的时候,你就要想一想,是因为什么导致了现在的状况,是因为知识点没有理解就开始敲代码,还是因为别的

这个其实很重要,比如这个大数相乘,如果你做过,看这类的代码那么就很流畅,很顺利,但是相反没有看过,很可能就被大数相乘这个名字吓到,所以说 知识点不够,没有记住,这个才是我的局限,所以并不是智商的差距,而是努力与不努力的差距

posted @ 2018-03-28 20:14  pprp  阅读(227)  评论(0编辑  收藏  举报