T1训练:求正整数数根

题面:

东东对数字很敏感,他定义了一个数的数根,数根即把一个数的各个位上的数字加起来可以得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于 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
#include
#include
#include
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<
 for(long long i=0;i<len;i++)
 {
  n+=s[i]-'0';
 }
 //cout<
 ans=shu(n);
 cout<<ans;
 return 0;
}

你可能感兴趣的:(VJudge)