如何使用递归函数计算数字的持久性(Persistence)
实现数字持久性的递归方案
首先明确下数字持久性的定义:
将一个多位数的各位数字相乘,重复这个过程直到得到一位数,整个过程的循环次数就是该数字的持久性。举个例子,数字
39的计算过程是:3×9=27 → 2×7=14 →1×4=4,一共经历3次相乘操作,所以它的持久性是3。
看了你给出的代码片段,目前只完成了主函数框架和递归函数的声明,还需要补全persistence函数的实现,以及完善主函数里的逻辑。下面是完整的可运行代码,用递归完美实现这个功能:
#include <stdio.h> // 递归计算数字的乘法持久性 int persistence(int x) { // 递归终止条件:如果是一位数,不需要再计算,返回0 if (x < 10) { return 0; } int product = 1; // 计算当前数字各位的乘积 while (x > 0) { product *= x % 10; x /= 10; } // 递归调用:乘积的持久性 + 当前这一步的计数(1次相乘) return 1 + persistence(product); } int main() { int x; printf("Enter a number:\n"); // 持续读取输入,直到用户输入非数字内容退出 while (scanf("%d", &x) == 1) { // 简单输入校验:持久性仅针对正整数 if (x <= 0) { printf("Please enter a positive integer.\n"); } else { int result = persistence(x); printf("The multiplicative persistence is: %d\n", result); } printf("\nEnter another number (or enter non-digit to exit):\n"); } return 0; }
代码关键点说明:
- 递归逻辑:
persistence函数先判断当前数字是否为一位数,如果是则返回0(终止递归);否则计算各位数字的乘积,递归计算该乘积的持久性后加1(当前这次相乘算一次循环计数)。 - 输入处理:主函数通过
scanf的返回值判断输入有效性,同时加入非正整数校验,避免无效输入引发错误。 - 测试示例:
- 输入
39,输出3 - 输入
999,计算过程为9×9×9=729 →7×2×9=126 →1×2×6=12 →1×2=2,共4次循环,输出4 - 输入
5(一位数),输出0
- 输入
内容的提问来源于stack exchange,提问作者briduss
相关产品推荐
相关产品推荐

