【问题标题】:Recursive function to check digits递归函数检查数字
【发布时间】:2013-11-30 21:59:12
【问题描述】:

编写一个递归函数来检查数字中有多少位可以除以它们后面的数字。示例:84963 应该返回 2,因为 8 可以除以 4,6 可以除以 3。我的函数似乎根本没有输出任何内容。

#include <iostream>

using namespace std;

int fun (int n);

int main()
{
    int n;
    cin >> n;
    cout << fun(n) << endl;
    return 0;
}

int fun(int n){
    int count = 0;
    if (fun(n % 100) % fun(n % 10) == 0)
        count++;
    return count;
}

【问题讨论】:

  • 你应该使用调试器并寻找值......你会学到很多东西
  • 你试过我的建议了吗?通过使用 3 个参数而不是 1 个参数,您将提高内存使用率(在处理大数字时非常重要)

标签: c++ function recursion


【解决方案1】:

您的递归目前没有多大意义。一个更合乎逻辑的方法是查看最后一个数字(321 中的1)当前是否可以划分倒数第二个数字(321 中的2)。您可以通过定义一个检查是否可行的函数来执行此操作,并递归地传递除以 10 的数字。该函数看起来像这样:

int fun(int n)
{
  if (n < 10)
    return 0;
  int last = n % 10;
  n = n / 10;
  int secondlast = n % 10;
  if (secondlast != 0 && last != 0 && secondlast % last == 0) 
    return 1 + fun(n);
  else
    return fun(n);
}

更新说明:从莫斯科的评论中查看 Vlad 后,我将条件的 last != 0 部分向前移动,以解决一个错误(除以 0)。

来自莫斯科的 Vlad 谈到的问题如下:例如,如果您想将部分 04 计为 0,您应该使用上面的代码。否则,您应该删除 secondlast != 0 部分。

【讨论】:

  • 似乎崩溃了。。我检查了调试器,由于某种原因它变为 0,这可能是原因吗?
  • 也许我来自n的崩溃是0
  • @user3002211,对不起,它没有经过测试。我解决了这个问题。
  • @Patrick Kostjens 这是一个问题,因为在这种情况下 secondlast % last == 0
  • @VladfromMoscow,问题实际上略有不同。查看我的更新。
【解决方案2】:
int countIfDiv(int num) {
    int pair = num % 100;
    int first = pair / 10;
    if (first == 0) return 0;
    int second = pair % 10;
    int next = num / 10;
    return first % second == 0 ? 1 + countIfDiv(next) : 0 + countIfDiv(next);
}

只需拉一对,尝试除法,然后砍掉最后一个数字并重复。

【讨论】:

    【解决方案3】:

    您实际上并没有更新 n 值,因此您进入了无限循环,另一方面,您的函数最初仅设计用于 3 位数字。我认为它应该类似于:

    int fun(int n, int ant, int count){
        if( n == 0 )
            return count;
    
        if (ant != 0 &&
                 (n%10) % ant == 0)
            count++;
    
        return fun(n/10, n%10, count);
    }
    

    我应该使用不同的位数。

    【讨论】:

      【解决方案4】:

      有效的代码将是

      size_t fun( int n )
      {
          const int base = 10;
          int digit = n % base;
          n /= base;
      
          return ( n == 0 ? 
                   0      : 
                   ( digit && n % base && !( n % base % digit ) ) + fun( n ) );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 2019-06-12
        • 2015-03-19
        • 1970-01-01
        • 2013-01-22
        • 2020-03-09
        • 1970-01-01
        相关资源
        最近更新 更多