#! /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 条评论:
like this? 不过可读性就不好了
my $sum = 0;
sub getS {
$_ = shift;
$_ * ($_ + 1) * (($_ << 1) + 1)) / 6;
}
for (1 .. $n) {
$sum += (($_ << 1) - 1) * getS($n - $_ + 1);
}
n = 300时的耗时对比:
82359030040
time elapsed: 0.000619888305664063
82359030040
time elapsed: 3.10875511169434
发表评论