gnu coreutils factor.c源码分析

107 篇文章 1 订阅
95 篇文章 1 订阅

这段程序很有意思,从字面上翻译,不是求因式分解吗?
打开程序,有其中一段:
 d = 2;
  do
    {
      q = n / d;
      while (n == q * d)
 {
   assert (n_factors < max_n_factors);
   factors[n_factors++] = d;
   n = q;
   q = n / d;
 }
      d += *(w++);
      if (w == WHEEL_END)
 w = WHEEL_START;
    }
  while (d <= q);
我原来就喜欢这些简单的数字编程,这看上去就是进行因式分解。
真有意思。不过
   d += *(w++);
这句没弄明白,不明白这个增量是何意思,而且后面,还好象有循环一样。
      if (w == WHEEL_END)
 w = WHEEL_START;
所以还是快速的浏览。
先从头扫到尾,再从main.c开始看。
  if (argc == 1)
    fail = do_stdin ();
  else
    {
      int i;
      for (i = 1; i < argc; i++)
 fail |= print_factors (argv[i]);
    }
这段话,如果不带选项,就对标准输入中的数据分解,否则把传入的参数逐个分解。
我在linux下把这个命令执行一下,果然如此。
再看print_factors
先把传入的字串转为数字
  if (xstrtoumax (s, NULL, 10, &n, "") != LONGINT_OK)
再就进行分解
  n_factors = factor (n, MAX_N_FACTORS, factors);
而分解因式的那段为何对增量要循环呢???真是不可理解。
而且,do_stdin调用了一个超级复杂的函数,不明白,为什么做得这么复杂,下次再细看。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值