天天看點

HDU 1013 Digital Roots 數字根 字元串處理基礎題

題意:給你一個整數(騙你的),讓你求它的數字根(經過處理後隻剩下的個位數),如果不是個位數就要循環一個操作:把各個位的數加起來組合成一個新數,直到這個數是一個個位數(即題目所說的數字根)。

這題其實不難,題目也短,還好了解,然後正常人都很快就用一個int就寫完并開心地交上去了。

恭喜你得到了一個WA。

然後你反複檢查自己的代碼,覺得,沒毛病啊,int範圍不夠?改個long int 或 long long int 交上去,太棒了,還是一個WA。

這時候你就基本該想到了,這是一個超過long long int 範圍的大整型,和1002題目一樣考的是字元串處理。

估計這個串的規模在1000左右,出題人的目的達到了,不會在串的長度上為難人的,畢竟是道基礎題。

杭電傳送器

HDU 1013 Digital Roots 數字根 字元串處理基礎題

以下是我的AC代碼:

HDU 1013 Digital Roots 數字根 字元串處理基礎題
#include <iostream>
#include <string>
using namespace std;

int main()
{
    //如果用int 或 long long int 都隻能得到WA,但你又感覺自己的代碼符合題意
    //這就意味着不是你思路錯,而是題目規模,那麼短的題目肯定有坑
    string str;                           //用string類定義字元串時不寫一維長度
    while(cin >> str)
    {
        if(str[0]=='0')                   //輸入0結束
            break;
        else                              //9*1000都還沒超過整型,估計這題的串規模在1000左右
        {
            int n=0,a;
            for(int i=0;str[i]!='\0';i++) //把串的和變為整型存到n
                n+=str[i]-'0';
            while(n>=10)                  //對n進行處理知道n是個位數(即題目說的數字根)
            {
                a=n;                      //用一個變量a來代替n進行下面的處理
                n=0;                      //先清零變量n
                while(a)                  //把a的各個位的數的和賦給n,循環到a==0的時候結束
                {
                    n+=a%10;              //每次都加個位數
                    a/=10;                //把a的個位除掉
                }
            }
            cout << n << endl;            //AC了,好開心!
        }
    }
    return 0;
}