算法注意---4、解决算法bug的一条思路(除了日志,二分法查bug)
一、总结
一句话总结:
遇到代码bug,打印前几百个结果,一下子就知道错在哪了,比如高精度做斐波那契数列
1、memset(f,-1, sizeof(f));?
memset的sizeof在最后,要设置的值在中间
2、memset的头文件?
string.h,因为本来就是初始化string的值的,对应在c++中就是cstring
3、矩阵乘法?
矩阵乘法的ijk就是我们正常模拟矩阵的乘的顺序
1 2 3 4 5 6 1 2 3 4 5 6 for(int i=0; i!=ans.h_size(); ++i) A的每一行一行的来 for(int j=0; j!=ans.l_size(); ++j) A的每一行都要和B的每一列乘 for(int k=0; k!=m.l_size(); ++k) A的一行的每一个数都要和B的一列的每一个数相乘 ans[i][j]+=m[i][k]*n[k][j];
4、c++函数的参数传递二维数组?
int multiply(int a[3][3],int b[3][3]){}
int multiply(int a[3][3],int b[3][3]){ int ans[3][3]={0}; for (int i = 1; i <= 2; ++i) for (int j = 1; j <= 2; ++j) for (int k = 1; k <= 2; ++k) ans[i][j]+=(a[i][k] * b[k][j]) % mod; } multiply(base,base);
5、c++函数返回二维数组?
1、算法题中c++函数返回二维数组,这样的需求很小,一般都是创建一个结构体,然后返回结构体
2、像java、js等我们就可以直接返回一个二维数组
struct matrix{ ll s[2][2]; int n,m; void clear(){ s[0][0]=1;s[0][1]=1;s[1][0]=1;s[1][1]=0; n=2;m=2; } }; matrix mix(matrix A,matrix B){ matrix re; re.n=A.n;re.m=B.m; for(int i=0;i<re.n;i++){ for(int j=0;j<re.m;j++){ re.s[i][j]=0; for(int k=0;k<A.m;k++){ re.s[i][j]=(re.s[i][j]+(A.s[i][k]*B.s[k][j])%mod)%mod; } } } return re; }
6、快速幂?
a^11=a^(2^0+2^1+2^3),我们将a¹¹转化为算 a2^0*a2^1*a2^3,原来算11次,现在算三次
a^11=a^(2^0+2^1+2^3),11的二进制是1011, 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a2^0*a2^1*a2^3,也就是a1*a2*a8,看出来快的多了吧原来算11次,现在算三次 int poww(int a, int b) { int ans = 1, base = a; while (b != 0) { if (b & 1 != 0){ ans *= base; } base *= base; b >>= 1; } return ans; }
7、取模是无论加还是乘都要取模?
ans.a[i][j]+=(a.a[i][k] * b.a[k][j]) % mod;
ans.a[i][j]%=mod;
8、c++从文件中读取和输出到文件?
freopen("9in.txt","r",stdin);
freopen("9out.txt","w",stdout);
9、当n(2^63)比较大,超出int的时候,特别要注意的点是什么(比如斐波那契数列的矩阵快速幂解法)?
读入以及任何存储的位置(比如函数的参数传递、比如矩阵元素存储)都不能用int,用long long
注意点: 1、 读入n的时候不能用int,因为1<=n<2^63 2、 注意结构体中的数组要用 long long类型,因为涉及到矩阵的乘法, 涉及到两个数相乘,所以int mod 1000000007之后,两个数相乘,还是会超int 3、 因为读入的n是long long类型,所以函数传递参数的时候,也要记得别用成int了 //矩阵的快速幂 Matrix pow(Matrix a,long long n){ Matrix ans,base=a; ans.row=2;ans.column=2; ans.v[1][1]=ans.v[2][2]=1; while(n){ if(n%2==1) ans=multiply(ans,base); base=multiply(base,base); n/=2; } return ans; }
10、解决算法bug的一条思路(除了日志,二分法查bug)?
遇到代码bug,打印前几百个结果,一下子就知道错在哪了,比如高精度做斐波那契数列
二、内容在总结中
博客对应课程的视频位置: