一只小蒟蒻备考蓝桥杯的日志
笔记
高精度乘法
不用像上面那样麻烦:
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题,so easy
- 第2题,又卡了,这次想把每位的商存到temp二维数组里,然后全部加起来,移位那里卡了
发现之前是,屡乘屡加,挺好,移位那里处理得很巧妙,上附 - 第3题,真崩溃我说…
辛辛苦苦写高精度乘法,结果…
小结
我我我…鸽了两天…深刻反思中,接下去要安排个进度表,不能练过去看了!
加油! ! !
小蒟蒻好荣幸发现自己的备赛日志受到你的关注,2024寒假无特殊情况坚持日更!