2007年7月4日星期三

Area of Squares

#! /usr/bin/perl
use warnings;
use strict;


=problem
author: redspid@gmail.com
计算下图中所有正方形的面积之和
_____________
|__|__|__|__|__|    00 01 02 03 04 05
|__|__|__|__|__|    10 11 12 13 14 15
|__|__|__|__|__|    20 21 22 23 24 25
|__|__|__|__|__|   30 31 32 33 34 35
|__|__|__|__|__|   40 41 42 43 44 45
|__|__|__|__|__|    50 51 52 53 54 55

=cut

# 开启整数环境。使用整数环境后,
# 可计算大正方形的最大边长减小,因整数数值范围比浮点数小
# 但计算速度有所提升。
# dprofpp 测试结果显示:
# 大正方形边长为 120个单位时速度约提升 5% 。
# 大正方形边长越大,速度提升越明显。

use integer
;

my $n = 20; # 大正方形边长
my $area = 0;

for my $row (0 .. $n- 1) {
    for my $col (0 .. $n- 1) {
    my $m = $row > $col ? $n-$row : $n-$col;

    if ( $m == 1) { $area += 1 }
    else { for my $i (1 .. $m ) { $area += $i *$i } }
    }
}

print $area, "\n";

2 条评论:

Chen Shixin 说...

like this? 不过可读性就不好了
my $sum = 0;

sub getS {
    $_ = shift;
    $_ * ($_ + 1) * (($_ << 1) + 1)) / 6;
}

for (1 .. $n) {
    $sum += (($_ << 1) - 1) * getS($n - $_ + 1);
}

Chen Shixin 说...

n = 300时的耗时对比:

82359030040
time elapsed: 0.000619888305664063

82359030040
time elapsed: 3.10875511169434