免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5961 | 回复: 15
打印 上一主题 下一主题

perl挑战二,有兴趣的同学赶紧来看看 [复制链接]

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-19 15:26 |只看该作者 |倒序浏览
定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数。前几个半质数是 4, 6, 9, 10, 14, 15, 21, 22, 25, 26。问题是,输入两个正整数x<=y,问[x,y]之间有多少个半质数?

输入,y

输出:[x,y]之间有多少个半质数。

输入数据范围 1<=x<=y<=2000000。
附上一种求质数的方法:
  1. for my $t( $x..$y) {
  2.     my $flag = 1;
  3.     for (my $j = 2;$j <= sqrt($t);$j++) {
  4.   # 如果可整除,则不是质数
  5.     if ($t % $j == 0) {
  6.         $flag = 0;
  7.         last;
  8.        }
  9.     }
  10. push @aa,$t if $flag;
  11. }
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
2 [报告]
发表于 2014-02-19 15:39 |只看该作者
默默去查了一下什么是质数···

只有1和它本身两个正因数的自然数,叫质数(Prime Number)。··

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [报告]
发表于 2014-02-19 16:10 |只看该作者
  1. #! /usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my @pn;
  5. my %pn;
  6. my $x = 2;
  7. my $y = 100;
  8. my $c = 0;

  9. for my $i ( $x .. $y )
  10. {
  11.         my $f = 1;
  12.         for my $j ( 0 .. $#pn )
  13.         {
  14.                 last if $pn[$j] > sqrt($i);
  15.                 if ( $i % $pn[$j] == 0 )
  16.                 {
  17.                         $f = 0;
  18.                         $c ++ if exists $pn{$i/$pn[$j]};
  19.                 }
  20.         }
  21.         if ( $f == 1 )
  22.         {
  23.                 push @pn, $i;
  24.                 $pn{$i} = 1;
  25.         }
  26. }

  27. print "$c\n";
复制代码

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
4 [报告]
发表于 2014-02-19 16:34 |只看该作者
x,y非固定哦回复 3# ly5066113


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2014-02-19 16:42 |只看该作者
回复 4# 只是一个红薯
  1. $ cat test.pl
  2. #! /usr/bin/perl

  3. use strict;
  4. use warnings;

  5. my @pn;
  6. my %pn;
  7. my $x = shift;
  8. my $y = shift;
  9. my $c = 0;

  10. for my $i ( 2 .. $y )
  11. {
  12.         my $f = 1;
  13.         for my $j ( 0 .. $#pn )
  14.         {
  15.                 last if $pn[$j] > sqrt($i);
  16.                 if ( $i % $pn[$j] == 0 )
  17.                 {
  18.                         $f = 0;
  19.                         $c ++ if $i >= $x && exists $pn{$i/$pn[$j]};
  20.                 }
  21.         }
  22.         if ( $f == 1 )
  23.         {
  24.                 push @pn, $i;
  25.                 $pn{$i} = 1;
  26.         }
  27. }

  28. print "$c\n";
  29. $
  30. $ ./test.pl 50 100
  31. 17
  32. $ ./test.pl 50 1000
  33. 282
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
6 [报告]
发表于 2014-02-19 16:49 |只看该作者
{:2_169:} 查一下下什么是质数

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
7 [报告]
发表于 2014-02-19 19:38 |只看该作者
回复 5# ly5066113


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
8 [报告]
发表于 2014-02-20 02:32 |只看该作者
~
  1. #!/usr/bin/perl

  2. my ( $x, $y ) = do { print 'x, y: '; split /\s+/, <> };
  3. my $count;

  4. number: for my $i ( $x .. $y ) {
  5.     my $yes = 0;
  6.     loop: for ( 2 .. sqrt $i ) {
  7.         next if $i % $_;
  8.         $yes++ ? next number : ( $i /= $_ ) and goto loop;
  9.     }
  10.     $count++ if $yes == 1;
  11. }

  12. print $count;
复制代码

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
9 [报告]
发表于 2014-02-20 09:11 |只看该作者
{:3_189:} 回复 8# rubyish


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2014-02-20 17:34 |只看该作者
代码有点丑,不过效率还是蛮高的:
  1. my $x = shift;
  2. my $y = shift;
  3. my ( @array, $count );
  4. loop: for my $i ( sqrt($x) .. $y/2 ) {
  5.         next unless $i > 1;
  6.         $i % $_ == 0 && next loop for 2 .. sqrt($i);
  7.         push @array, $i;
  8. }
  9. for my $i ( 0 .. $#array ) {
  10.         for my $j ( $i .. $#array ) {
  11.                 if ( $array[$i] * $array[$j] >= $x && $array[$i] * $array[$j] <= $y ) {
  12.                         $count++;
  13.                 } else {
  14.                         last;
  15.                 }
  16.         }
  17. }
  18. print "$count$/";
复制代码
效率对比,与@ly5066113@rubyish的脚本做了下对比,a脚本是我的脚本,b脚本是ly5066113的,c脚本是rubyish的:
  1. $ time ./a 2 1500000
  2. 309289

  3. real    0m9.516s
  4. user    0m0.015s
  5. sys     0m0.031s

  6. $ time ./b 2 1500000
  7. 309289

  8. real    2m20.250s
  9. user    0m0.015s
  10. sys     0m0.031s

  11. $ time ./c
  12. 2 1500000
  13. x, y: 309289
  14. real    0m57.953s
  15. user    0m0.015s
  16. sys     0m0.062s
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP