题意:给你一个整数(骗你的),让你求它的数字根(经过处理后只剩下的个位数),如果不是个位数就要循环一个操作:把各个位的数加起来组合成一个新数,直到这个数是一个个位数(即题目所说的数字根)。
这题其实不难,题目也短,还好理解,然后正常人都很快就用一个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;
}