lqb日志10-[高精度+模拟]

一只小蒟蒻备考蓝桥杯的日志

文章目录

    • 笔记
      • 高精度乘法
      • char和string相互转换
    • 刷题
    • 心得
    • 小结

笔记

高精度乘法

lqb日志10-[高精度+模拟]_第1张图片
不用像上面那样麻烦:
nc[i+j-1]+=na[i]×nb[j];
a的第i位乘以b的第j位为积的第i+j-1位
下面Demo自己写的,注释很认真

string mult(char* a, char* b) {
	int alength = strlen(a);
	int blength = strlen(b);
	int mid1[alength], mid2[blength];
	int mid3[alength + blength + 1]; //Attention!数组大小,我越过界...
	for(int i = 1; i <= alength; i++) mid1[i] = *(a + i - 1) - '0';
	for(int i = 1; i <= blength; i++) mid2[i] = *(b + i - 1) - '0';
	memset(mid3, '\0', sizeof(mid3));

	for(int i = 1; i <= alength; i++) {
		for(int j = 1; j <= blength; j++) {
			mid3[i + j - 1] = mid1[i] * mid2[j];
			//a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位)
		}
	}
	
	//统一处理进位
	//Attention!mid3[n]是从右往左数的第n位
	for(int i = 1; i <= alength + blength - 1; i++) {
		mid3[i + 1] += mid3[i] / 10;
		mid3[i] %= 10;
	}
	//处理最高位 把从右往左看,逆转成常见的从左往右
	string ans;
	if(mid3[alength + blength] != 0) {
		ans += (mid3[alength + blength] + '0');
	}
	for(int i = alength + blength - 1; i >= 1; i--) {
		ans += (mid3[i] + '0');
	}
	return ans;
}

小心,一会是char一会是int,注意要不要+/- ‘0’

char和string相互转换

参考 c++ 中 char 与 string 之间的相互转换问题
我还没搞明白,明天一定

刷题

  1. P1601 A+B Problem(高精)
  2. P1601 A*B Problem(高精)没写出来,附 上次ac的源码
  3. P1249 最大乘积 还没过…

心得

  1. 第1题,so easy
  2. 第2题,又卡了,这次想把每位的商存到temp二维数组里,然后全部加起来,移位那里卡了
    发现之前是,屡乘屡加,挺好,移位那里处理得很巧妙,上附
  3. 第3题,真崩溃我说…
    辛辛苦苦写高精度乘法,结果…lqb日志10-[高精度+模拟]_第2张图片

小结

我我我…鸽了两天…深刻反思中,接下去要安排个进度表,不能练过去看了!
加油! ! !

小蒟蒻好荣幸发现自己的备赛日志受到你的关注,2024寒假无特殊情况坚持日更!

你可能感兴趣的:(蓝桥杯日志,算法,蓝桥杯,c++,c语言)