子孙数的数目(108)

何为子孙数?

在一个数的最左边加上一个自然数,该自然数不能超过最左边这个数的一半,得到的新数为其子孙数,一个数的所有子孙数应该分解到最左边都为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;
}

总结:这道题中的"小问题"是对一个数求子孙数的个数,递归出口为此数不可再对其求子孙数的情况,递归体则是写明如何对一个数求其子孙数的个数,递归语句表达的是对每一个数再求其子孙数目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值