用于检查数字的递归函数

时间:2013-11-17 21:00:54

标签: c++ function recursion

写一个递归函数来检查数字中的数字可以除以它后面的数字。示例: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;
}

4 个答案:

答案 0 :(得分:1)

目前你的递归没有多大意义。对此更合乎逻辑的方法是查看最后一个数字(1中的321)当前是否可以除以倒数第二个数字(2中的321) 。你可以通过定义一个检查是否可能的函数来做到这一点,并递归地传递除以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);
}

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

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

答案 1 :(得分:0)

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);
}

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

答案 2 :(得分:0)

你实际上并没有更新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);
}

我应该使用不同的位数。

答案 3 :(得分:0)

有效代码为

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 ) );
}