何为子孙数?
在一个数的最左边加上一个自然数,该自然数不能超过最左边这个数的一半,得到的新数为其子孙数,一个数的所有子孙数应该分解到最左边都为1时才算结束,例如45子孙数为45、145、245、1245
#include<stdio.h>
int main()
{
int n = 0;
printf("请输入一个数:\n");
scanf("%d", &n);
int fun(int);
printf("此数的子孙数有%d个\n",fun(n));
return 0;
}
int best(int n)//返回最高位的值
{
while (n / 10 != 0)
{
n = n / 10;
}
return n;
}
int fun(int n)
{
int best(int);//best用于求某个数的最高位是几
static int sum = 0;//防止下一次进入递归在对sum初始化
int i;
if (best(n) == 1)//一个数最高位为1时不能再分解
{
sum++;
}
else
{
sum++;//一个数本身也是子孙数
for (i = 1; i <= best(n) / 2; i++)//递归处理余下可分解的数
{
fun(i);
}
}
return sum;
}
总结:这道题中的"小问题"是对一个数求子孙数的个数,递归出口为此数不可再对其求子孙数的情况,递归体则是写明如何对一个数求其子孙数的个数,递归语句表达的是对每一个数再求其子孙数目