微信扫一扫打赏支持

算法注意---4、解决算法bug的一条思路(除了日志,二分法查bug)

算法注意---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,打印前几百个结果,一下子就知道错在哪了,比如高精度做斐波那契数列

 

 

 

二、内容在总结中

博客对应课程的视频位置:

 

 

 
posted @ 2020-06-13 14:26  范仁义  阅读(215)  评论(0)    收藏  举报