T1训练:求正整数数根

题面:

东东对数字很敏感,他定义了一个数的数根,数根即把一个数的各个位上的数字加起来可以得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于 2424 来说,把 2244 相加得到 66,由于 66 是一位数,因此 662424 的数根。再比如 3939,把 3399 加起来得到 1212,由于 1212 不是一位数,因此还得把 1122 加起来,最后得到 33,这是一个一位数,因此 333939 的数根。
输入格式
一个正整数(小于 10100010^{1000})。
输出格式
一个数字,即输入数字的数根。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章