题面:
东东对数字很敏感,他定义了一个数的数根,数根即把一个数的各个位上的数字加起来可以得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于 来说,把 和 相加得到 ,由于 是一位数,因此 是 的数根。再比如 ,把 和 加起来得到 ,由于 不是一位数,因此还得把 和 加起来,最后得到 ,这是一个一位数,因此 是 的数根。
输入格式
一个正整数(小于 )。
输出格式
一个数字,即输入数字的数根。
sample input:
24
sample output:
6
思路:
- 求数根的题之前做过,然后欢乐的写递归,欢乐的递交,然后就WA了
- 本题需要注意的重点是输入的正整数的范围,这个范围是超过long long 范围的,但是他的位数的范围是在int的范围内的(1的后面跟1000个0,一共1001位)
- 所以使用字符串将长数字读入,然后按位数将每一位的数加起来求和,再将和进行求数根的操作
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
using namespace std;
int shu(long long n)
{
long long sum=0;
while(n>0)
{
sum+=n%10;
n/=10;
}
if(sum>=10)
sum=shu(sum);
else return sum;
}
int main()
{
long long len=0;
long long ans=0,n=0;
//scanf("%lld",&n);
string s;
cin>>s;
len=s.length();
//cout<<len;
for(long long i=0;i<len;i++)
{
n+=s[i]-'0';
}
//cout<<n<<endl;
ans=shu(n);
cout<<ans;
return 0;
}