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