1035. 数根 (Standard IO)
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
数根是这样定义的:对于一个正整数n,将它的各个数位上的数字相加得到一个新数,如果这个数是一位数,我们就称之为n的数根,否则重复处理直到它成为一个一位数。
例如,n=34,3+4=7,7是一位数,所以7是34的数根。
再如,n=345,3+4+5=12,1+2=3,3是一位数,所以3是345的数根。
对于输入数字n,编程计算它的数根。
输入
输入正整数n。
输出
输出n的数根。
样例输入
345
样例输出
3
数据范围限制
1<=n<2^31
-------------------------------------------------------------------------
问题分析
这是一个层层递进的问题,所以使用了递归的方法,设定一个递归边界 if(strlen(b) == 1),就是当字符串的长度为1时,结束。
程序中使用了sprintf函数,把int转换成char数组来运算,因为如果直接用int去计算各个位上的和的话,需要用到 / 和 % ,会比较麻烦,转换成字符运算的话,相对比较简单。
程序代码
#include <iostream>
#include <cstring>
#include <stdlib.h>
using namespace std;
int getShuGeng(char* b);
char a[20];
int k;
int main()
{
int n;
cin >> n;
sprintf(a,"%d",n); //一开始使用itoa(n,a,10);在dev是没有问题的,但是放到oj就报错
getShuGeng(a);
cout << k;
return 0;
}
int getShuGeng(char* b)
{
k = b[0]- '0';
if(strlen(b) == 1)
return b[0];
for(int i=1;i<strlen(b);i++)
{
k += b[i] - '0';
}
sprintf(b,"%d",k);
getShuGeng(b);
}