1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <string.h> #include <stdio.h> int MATSIZE = 801; int mata[810][810]; int matb[810][810]; int matc[810][810]; int main(){ while (scanf("%d",&MATSIZE) != EOF) { int i,j,k; for (i = 0;i < MATSIZE; i++) { for (j = 0; j < MATSIZE; j++) { scanf("%d",&mata[i][j]); mata[i][j] %= 3; } } for (i = 0;i < MATSIZE; i++) { for (j = 0; j < MATSIZE; j++) { scanf("%d",&matb[i][j]); matb[i][j] %= 3; } } memset(matc, 0, sizeof(matc)); for(i = 0;i < MATSIZE;i++){ for(j = 0;j < MATSIZE;j++){ if (matb[i][j] == 0) { continue; } for(k = 0;k < MATSIZE;k++){ matc[k][j] += mata[k][i] * matb[i][j]; } } } for (i = 0;i < MATSIZE; i++) { for (j = 0; j < MATSIZE-1; j++) { printf("%d ",(matc[i][j]+3)%3); } printf("%dn",(matc[i][MATSIZE-1]+3)%3); } } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <string.h> #include <stdio.h> int MATSIZE = 801; int mata[810][810]; int matb[810][810]; int matc[810][810]; int main(){ while (scanf("%d",&MATSIZE) != EOF) { int i,j,k; for (i = 0;i < MATSIZE; i++) { for (j = 0; j < MATSIZE; j++) { scanf("%d",&mata[i][j]); mata[i][j] %= 3; } } for (i = 0;i < MATSIZE; i++) { for (j = 0; j < MATSIZE; j++) { scanf("%d",&matb[i][j]); matb[i][j] %= 3; } } memset(matc, 0, sizeof(matc)); for(k = 0;k < MATSIZE;k++){ for(i = 0;i < MATSIZE;i++){ for(j = 0;j < MATSIZE;j++){ matc[i][j] += mata[i][k] * matb[k][j]; } } } for (i = 0;i < MATSIZE; i++) { for (j = 0; j < MATSIZE-1; j++) { printf("%d ",(matc[i][j]+3)%3); } printf("%dn",(matc[i][MATSIZE-1]+3)%3); } } return 0; } |
上面的T下面的过,开始我还以为是TMD被逗了,直到我看到了这个:
http://blog.csdn.net/a775700879/article/details/11750703
然后我就吓尿了。。。10倍的效率差距
上面的那个,是利用了乘法式子中可以通过调整固定一个值,如果这个值是0就可以剪枝不循环这次的第三重直接往下走了,但是收效甚微。
getchar()的输入挂。。。那货我伺候不来,感觉太玄了没有写。
而下面那个是把原来i,j,k循环中的k拿了出来做了第一重,这样带来的变化是原来第三重循环要跳k次行,现在的话第三重循环不再跳行。多维数组是线性存储的,CPU缓存比较小会经常更新,跳列的话,就很有可能无法利用CPU缓存的优势(注意缓存直连CPU,比内存还要快),因为当跳到下一行的时候,刚才那一行可能就被从CPU缓存中清除了,相当于第三重循环里面没有用到CPU缓存机能。
所以当疯狂访问数组的时候,时间卡的很丧病,就要看看是不把CPU缓存机能给浪费了。