题面:
东东对数字很敏感,他定义了一个数的数根,数根即把一个数的各个位上的数字加起来可以得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于
24
24
24 来说,把
2
2
2 和
4
4
4 相加得到
6
6
6,由于
6
6
6 是一位数,因此
6
6
6 是
24
24
24 的数根。再比如
39
39
39,把
3
3
3 和
9
9
9 加起来得到
12
12
12,由于
12
12
12 不是一位数,因此还得把
1
1
1 和
2
2
2 加起来,最后得到
3
3
3,这是一个一位数,因此
3
3
3 是
39
39
39 的数根。
输入格式
一个正整数(小于
1
0
1000
10^{1000}
101000)。
输出格式
一个数字,即输入数字的数根。
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;
}