免费注册 查看新帖 |

Chinaunix

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

[数值计算] 利用awk实现整数的因数分解---找问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-03 22:49 |只看该作者 |倒序浏览
#计算整数的因数分解,一行列出一个
#语法:awk -f factorize.awk Numbers
#使用举例:awk -f factorize.awk 10000 100001

#factorize.awk内容如下
{
        n = int($1)
        m = n = (n >= 2) ? n : 2
        factors = ""
        for ( k=2; (m>1)&&(k^2 <= m); )
        {
                if ( int(m%n) != 0 )
                {
                        k++
                        continue
                }
                m /= k
                factors = (factors=="") ? ("" k) : (factors " * " k)
        }
        if ((1<m) && (m<n))
                factors = factors " * " m
        print n, (factors == "") ? "is prime" : ("= " factors)
}

#但是运行总会出问题,提示为:10000无法打开。为什么将10000当做文件来处理了呢?希望帮忙解释一下。

论坛徽章:
0
2 [报告]
发表于 2013-06-04 04:53 |只看该作者
这样呢?
  1. awk -f factorize.awk <<<"10000 100001"
复制代码
或者
  1. echo "10000 100001"|awk -f factorize.awk
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
3 [报告]
发表于 2013-06-04 10:06 |只看该作者
如果你那个是按行处理的话,楼上的办法就行了。如果你那个是想用参数传递,可以试试两个方案(运行结果好像不对,那是代码逻辑的事啦):
  1. ##########################################
  2. ## 用传参数的方式

  3. [seesea@UC ~]$ awk -f factorize.awk 10000
  4. 10000 = 2 * 5000
  5. [seesea@UC ~]$ awk -f factorize.awk
  6. No argument.
  7. [seesea@UC ~]$ cat factorize.awk
  8. BEGIN {
  9.     if (ARGC < 2)
  10.     {
  11.         print "No argument."
  12.         exit
  13.     }

  14.     fac(ARGV[1])
  15. }

  16. function fac(num) {
  17.         n = int(num)
  18.         m = n = (n >= 2) ? n : 2
  19.         factors = ""
  20.         for ( k=2; (m>1)&&(k^2 <= m); )
  21.         {
  22.                 if ( int(m%n) != 0 )
  23.                 {
  24.                         k++
  25.                         continue
  26.                 }
  27.                 m /= k
  28.                 factors = (factors=="") ? ("" k) : (factors " * " k)
  29.         }
  30.         if ((1<m) && (m<n))
  31.                 factors = factors " * " m
  32.         print n, (factors == "") ? "is prime" : ("= " factors)
  33. }


  34. #########################################
  35. ## 或者用传变量的方式

  36. [seesea@UC ~]$ awk -v num=1000 -f factorize.awk
  37. 1000 = 2 * 500
  38. [seesea@UC ~]$ awk  -f factorize.awk            
  39. No argument.
  40. [seesea@UC ~]$ cat factorize.awk
  41. BEGIN {
  42.     if (num=="")
  43.     {
  44.         print "No argument."
  45.         exit
  46.     }
  47.     fac(num)
  48. }

  49. function fac(num) {
  50.         n = int(num)
  51.         m = n = (n >= 2) ? n : 2
  52.         factors = ""
  53.         for ( k=2; (m>1)&&(k^2 <= m); )
  54.         {
  55.                 if ( int(m%n) != 0 )
  56.                 {
  57.                         k++
  58.                         continue
  59.                 }
  60.                 m /= k
  61.                 factors = (factors=="") ? ("" k) : (factors " * " k)
  62.         }
  63.         if ((1<m) && (m<n))
  64.                 factors = factors " * " m
  65.         print n, (factors == "") ? "is prime" : ("= " factors)
  66. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-06-04 13:36 |只看该作者
回复 2# sk1418


    想问一下,为什么是3个<呢? 能不能解释一下,这点不太清楚。

   
awk -f factorize.awk <<<"10000 100001"

论坛徽章:
0
5 [报告]
发表于 2013-06-04 13:39 |只看该作者
回复 3# seesea2517


    逻辑错误找到了:
  1. for ( k=2; (m>1)&&(k^2 <= m); )
  2.         {
  3.                 if ( int(m%k) != 0 )
  4.                 {
  5.                         k++
  6.                         continue
  7.                 }
  8.                 m /= k
  9.                 factors = (factors=="") ? ("" k) : (factors " * " k)
  10.         }
复制代码
应该是: m%k 而不是 m%n 我的失误。

PS:程序现在还只能一次读取一个数,我得再去修改修改,增强一下功能。不过还是谢谢了!

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
6 [报告]
发表于 2013-06-04 17:21 |只看该作者
回复 4# UltimateSniper


    搜索 here string 看看有没有收获。

论坛徽章:
0
7 [报告]
发表于 2013-06-05 14:34 |只看该作者
回复 6# seesea2517


    十分感谢,让我有机会再次看到 “Here Document” ,重新复习了一下。

    here string 应该算是 here document 的特例了吧?
   
bash,ksh或zsh中也可以用here-字串:
$ tr a-z A-Z <<<"Yes it is a string"
YES IT IS A STRING

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
8 [报告]
发表于 2013-06-05 15:33 |只看该作者
回复 7# UltimateSniper


    是不是特例这个我还真没想过,只是觉得看上去长得像,用处也像

论坛徽章:
0
9 [报告]
发表于 2013-06-05 16:12 |只看该作者
回复 8# seesea2517


    最后的那个例子我是在 Here文档的中文wiki中看到的:

http://zh.wikipedia.org/wiki/Here%E6%96%87%E6%A1%A3

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
10 [报告]
发表于 2013-06-05 16:47 |只看该作者
本帖最后由 seesea2517 于 2013-06-05 16:49 编辑

回复 9# UltimateSniper


    学习了,感谢分享。这样看来,应该是特例。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP