博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Project Euler 85 :Counting rectangles 数长方形
阅读量:6914 次
发布时间:2019-06-27

本文共 2557 字,大约阅读时间需要 8 分钟。

By counting carefully it can be seen that a rectangular grid measuring 3 by 2 contains eighteen rectangles:

Although there exists no rectangular grid that contains exactly two million rectangles, find the area of the grid with the nearest solution.


如果数得足够仔细,能看出在一个3乘2的长方形网格中包含有18个不同大小的长方形,如下图所示:

尽管没有一个长方形网格中包含有恰好两百万个长方形,但有许多长方形网格中包含的长方形数目接近两百万,求其中最接近这一数目的长方形网格的面积

解题

 

有下面内容:

对于任意矩形M*N

其中1*1的矩阵有M*N个

1*2的矩阵有M*(N-1)个

2*1的矩阵有(M-1)*N个

 

实际上只要确定小矩阵左上角顶点在大矩形中的位置,这个矩阵的位置就唯一确定了

所有在任意矩形M*N中,矩阵i*j有(M-i+1)*(N-j+1)个  

所以对于M*N的矩阵总的矩阵数量是:

int num = 0;        for(int i =1;i<= m;i++){            for(int j =1;j<= n;j++){                num += (m-i + 1)*(n - j+1);            }        }

 

更让人想不到是是直接计算矩阵的数量:

num = (m+1)*m*(n+1)*n/4

Java

package Level3;import java.util.Random;public class PE085{        static void run() {        int limit = 100;        int close = Integer.MAX_VALUE;        int area  = 0;        for(int m =1;m< limit ;m++){            for(int n = 1;n< limit ;n++){                int num = grid_num(m,n);                if (num>2000000)                      break;                 if( Math.abs(num - 2000000 ) < Math.abs(close - 2000000)){                    close = num;                    area = n*m;                }                }        }        System.out.println(area);    }    public static int grid_num2(int m , int n){        int num = 0;        num = (m+1)*m*(n+1)*n/4;        return num;    }//    2772//    running time=0s0ms    public static int grid_num(int m , int n){        int num = 0;        for(int i =1;i<= m;i++){            for(int j =1;j<= n;j++){                num += (m-i + 1)*(n - j+1);            }        }        return num;    }//    2772//    running time=0s20ms    public static void main(String[] args){        long t0 = System.currentTimeMillis();        run();        long t1 = System.currentTimeMillis();        long t = t1 - t0;        System.out.println("running time="+t/1000+"s"+t%1000+"ms");    }}

 

你说是不是很流氓,这个规律,我怎么那么聪慧的会发现?

 Python

# coding=gbkimport time as time t0 = time.time()def run():    limit = 100    close = 0    area = 0    for m in range(1,limit):        for n in range(1,limit):            num = grid_num(m,n)            if num>2000000:break            if abs(num - 2000000) < abs(close -2000000):                close = num                area = n*m    print area    def grid_num(m ,n):    count = 0    for i in range(1,m+1):        for j in range(1,n+1):            count += (m-i+1)*(n-j+1)    return count run()t1 = time.time()print "running time=",(t1-t0),"s"# 2772# running time= 1.19499993324 s

 

转载地址:http://ahncl.baihongyu.com/

你可能感兴趣的文章
传统的MapReduce框架慢在那里
查看>>
Linux下修改Mysql的用户(root)的密码
查看>>
20个java异常处理最佳实践
查看>>
centos架设pptp服务:并测试windos客户端、Linux客户端!
查看>>
【c#】BackgroundWorker类的使用方法
查看>>
【NetApp】启用smb2.0
查看>>
001作业题
查看>>
关于实习
查看>>
叠加等边三角形
查看>>
【对拍√】
查看>>
重载,继承,重写,多态的区别
查看>>
NUnit笔记
查看>>
maven添加sqlserver的jdbc驱动包
查看>>
POJ 1426 Find The Multiple
查看>>
WPF入门教程系列五——Window 介绍
查看>>
数字图像处理中所用数学工具4---集合、逻辑操作与模糊集合
查看>>
网页换肤
查看>>
[BZOJ3751/NOIP2014]解方程
查看>>
【Java例题】3.5 级数之和
查看>>
silverlight多国语言研究
查看>>