HDU 1013 Digital Roots 数字根 字符串处理基础题

题意:给你一个整数(骗你的),让你求它的数字根(经过处理后只剩下的个位数),如果不是个位数就要循环一个操作:把各个位的数加起来组合成一个新数,直到这个数是一个个位数(即题目所说的数字根)。

这题其实不难,题目也短,还好理解,然后正常人都很快就用一个int就写完并开心地交上去了。

恭喜你得到了一个WA。

然后你反复检查自己的代码,觉得,没毛病啊,int范围不够?改个long int 或 long long int 交上去,太棒了,还是一个WA。

这时候你就基本该想到了,这是一个超过long long int 范围的大整型,和1002题目一样考的是字符串处理。

估计这个串的规模在1000左右,出题人的目的达到了,不会在串的长度上为难人的,毕竟是道基础题。

杭电传送器


以下是我的AC代码:



#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值