【问题标题】:Factorization in C-RecursionC-递归中的因式分解
【发布时间】:2016-09-13 11:00:43
【问题描述】:

我被要求在 c 中编写一个 void 函数(无循环),它得到一个偶数(比如说 80),并像这样打印它 2*2*5*2*2 如您所见,结果是 80 大声笑。 在 2 个数字之间,您需要打印“*”,而奇数(例如,5)则需要在中间打印,或者如果数字中有奇数“2”,假设您是 96需要这样打印:2*2*2*3*2*2 如果给定的数字是奇数,则返回该数字。 我不仅想得到答案,还想在开始编码之前得到你“思考”的方式。 这是我到目前为止得到的结果

if(n%4==0)
{
  printf("2*");
  PrintTwos(n/4);
  return;
 }
 if(n%2==0)
 {
 printf("*2");
 PrintTwos(n/2);
  return;
  }
   printf("%d",n);

【问题讨论】:

  • 你会怎么做(用笔和纸)?到目前为止,您尝试编写什么代码?
  • 显示一些代码!
  • 首先,考虑一个停止条件。假设这个数字是奇数。但我的主要问题是了解如何以奇数因子(5,对不起,如果这不是正确的词)出现在中间而不是在中间的方式打印我的数字结束
  • 就我can see 而言,您并没有走得太远。这段代码甚至不是一个函数!

标签: c recursion factorization


【解决方案1】:

这是一些伪代码:

func(nbr)
  isOdd(nbr)         // recursive stop condition
    print nbr
    return

  evenNbr = findFirstEven(nbr)  //return the shortest even number from nbr
  print evenNbr
  func(nbr / evenNbr)

我没有为* 打印添加逻辑,因为我相信你可以自己解决这个问题。一种情况会破坏该伪代码,但这是帮助您思考递归函数应该做什么的良好开端。

编辑以下 cmets:(不完整:中间的奇数缺失)

int findFirstEven(nbr, i) {
    if (nbr%i != 0)
      return findFirstEven(nbr, i++);
    return i;
}

int primefact(int n)
{
    int i=2;
    i = findFirstEven(n, i);

    printf("%d*", i);
    if(n==i)
        printf("1");
        return 0;
    else
        primefact(n/i);
}

(未测试)

【讨论】:

  • 我可以为这个问题添加解决方案,并帮助我了解那里发生了什么吗?
  • 你不想搜索一下吗?是学校运动吗?如果是,目标是自己思考。你几乎拥有这里的一切。但如果你真的不想……好吧……
  • 你必须做一些事情才能找到质数。你不能一直把所有素数的'if'都写对了:)让我们一起编辑主帖
  • 查看我的 EDIT,理解并尝试一下
  • 完全没有?甚至没有找到偶数?然后我们必须使那个循环......递归;-)
【解决方案2】:

您需要将 2 分成两半,因此您需要在递归步骤之前从数字中删除 two 个二 - 否则递归步骤也必须知道防止打印的深度左侧有很多个二。
当然你必须验证是否真的有两个二!

所以:

void PrintTwosInNumber(unsigned n)
{
    if(n % 4 == 0)
    {
        printf("2*");
        PrintTwosInNumber(n/4);
        printf("*2");
    }
    else if(n % 2 == 0)
    {
        printf("2*");
        PrintTwosInNumber(n/2);
    }
    else
        printf("%u", n);
}

你可以保存最后一个递归步骤

void PrintTwosInNumber(unsigned n)
{
    if(n % 4 == 0)
    {
        printf("2*");
        PrintTwosInNumber(n/4);
        printf("*2");
    }
    else if(n % 2 == 0)
        printf("2*%u", n/2);
    else
        printf("%u", n);
}

编辑:

请注意,函数将陷入n==0 的无限递归——零可以被2 无限整除。但是,零不能表示为任意数量的 2 和某个奇数的乘积,因此它超出了这个问题的范围。
无论如何,如果这是一个真正的编程任务,应该考虑这种特殊情况并添加一个保护if(n==0) return; 分支,以防调用者传递错误的参数值。

【讨论】:

  • 非常优雅的解决方案!
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多