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