24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2025级博士研究生招生报考通知
查看: 1811  |  回复: 10
本帖产生 3 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+3, 程序强帖+1): 谢谢参与活动! 2011-05-16 17:47:46
矩阵运算,matlab强项
CODE:
%% What is the greatest product of four adjacent numbers in any direction
% (up, down, left, right, or diagonally) in the 20×20 grid?
function result = euler11()
tic;
s = [08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48];
[m,n] = size(s);
result = 0;
for i=1:m-3
    for j=1:n-3
        curgrid = s(i:i+3,j:j+3);
        result = max([result,max([max(prod(curgrid,1)), ... % row -
                    max(prod(curgrid,2)), ... % column |
                    prod(diag(curgrid)), ... % diag \
                    prod(diag(imrotate(curgrid,90)))])]); % sub diag /
    end
end
toc;
end

结果,时间
CODE:
% Elapsed time is 0.158644 seconds.
% ans =
%     70600674

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2011-05-16 15:59:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★ ★
余泽成(金币+3, 程序强帖+1): 鼓励交流! 2011-05-18 17:14:09
写了个Fortran版的,好像结果不一样了。不知道怎么回事。主要是对角上的计算,不知道是不是算对了啊!
CODE:
Program euler11
    Implicit None
    Integer, Dimension(20,20) :: Matrix
    Integer :: M1 = 0, M2 = 0, M3 = 0
    Integer :: M = 0
    Integer :: Prod
    Integer :: I, J, K

    Open(100, File="matrix.txt")
    Do I = 1, 20
        Read(100, "(20(I2,X), I2)"), Matrix(I, :)
    EndDo
    Close(100)

    Do I = 1, 20 - 3
        M1 = MaxVal(Product(Matrix(I:I+3, :), 1))
        M2 = MaxVal(Product(Matrix(:, I:I+3), 2))
        M = Max(M1, M2, M)
    EndDo

    Do I = 1, 20 - 3
        Do J = 1, 20 - 3
            Prod = Product((/(Matrix(I+K, J+K), K=0,3)/))
            M3 = Max(M3, Prod)
        EndDo
    EndDo
    Print *, Max(M, M3)

EndProgram euler11

我这儿得51267216

[ Last edited by holmescn on 2011-5-18 at 16:16 ]
9楼2011-05-18 16:14:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★ ★
余泽成(金币+3): 鼓励交流! 2011-05-20 21:05:08
余泽成(程序强帖+1): 2011-05-23 19:05:40
用C写了一个,这样什么都清楚了。
CODE:
#include

int main(int argc, char** argv) {
    int i, j, k;
    int max1 = 0, max2 = 0, max3 = 0, max4 = 0;
    int max;
    int prod;
    int matrix[20][20];
    FILE* fp;

    fp = fopen("matrix.txt", "r");
    for ( i = 0; i < 20; i++) {
        for ( j = 0; j < 20; j++) {
            fscanf(fp, "%d", &matrix[i][j]);
        }
    }

    // 上下
    //
    for ( j = 0 ; j < 20; j++) {
        for ( i = 0; i < 20 - 3; i++) {
            prod = 1;
            for ( k = 0; k < 4; k++) {
                prod *= matrix[i+k][j];
            }
            max1 = max1 < prod ? prod : max1;
        }
    }
    // 左右
    //
    for ( i = 0; i < 20; i++) {
        for ( j = 0 ; j < 20 - 3; j++) {
            prod = 1;
            for ( k = 0; k < 4; k++) {
                prod *= matrix[i][j+k];
            }
            max2 = max2 < prod ? prod : max2;
        }
    }
    // 对角
    for ( i = 0; i < 20 - 3; i++) {
        for ( j = 0 ; j < 20 - 3; j++) {
            // 正对角
            prod = 1;
            for ( k = 0; k < 4; k++) {
                prod *= matrix[i+k][j+k];
            }
            max3 = max3 < prod ? prod : max3;
            // 反对角
            prod = 1;
            for ( k = 0; k < 4; k++) {
                prod *= matrix[i+3-k][j+k];
            }
            max4 = max4 < prod ? prod : max4;
        }
    }

    max = max1 < max2 ? max2 : max1;
    max = max  < max3 ? max3 : max;
    printf("%d\n", max);
    max = max  < max4 ? max4 : max;
    printf("%d\n", max);
    return 0;
}

我得到的两个结果:1. 没有反对角线的是51267216        2. 有反对角线的是70600674
10楼2011-05-20 16:13:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见