B. 迭代归一
Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 323 Submission Accepted: 74
Total Submission: 323 Submission Accepted: 74
Description
我们把一个正整数的每一位上的数字加起来,得到新的数字,我们把这样的一次操作称为一次迭代变换。直到这个数字只有一位数。
如,9876经过一次变换成为9+8+7+6=30,经过第二次变换成为3+0=3,结束。
那么9876就经过了两次迭代变换。如今给一个正整数,问需要迭代变换多少次后会停止。
如,9876经过一次变换成为9+8+7+6=30,经过第二次变换成为3+0=3,结束。
那么9876就经过了两次迭代变换。如今给一个正整数,问需要迭代变换多少次后会停止。
Input
一个整数t,表示测试数据组数(1<=t<=100)。
对于每组测试数据,只有一行,表示一个正整数,正整数最多有100000位。
对于每组测试数据,只有一行,表示一个正整数,正整数最多有100000位。
Output
输出若干行,每行对应每组数据需要迭代变换的次数
Sample Input
Original | Transformed |
3 2 10 99999999
Sample Output
Original | Transformed |
0 1 2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char num[100005];
int fun(int n)
{
int yushu = 0;
while(n > 0)
{
yushu += n % 10;
n /= 10;
}
return yushu;
}
int main()
{
int t, snum;
scanf("%d", &t);
while(t--)
{
scanf("%s",num);
if(strlen(num) == 1) printf("0\n");
else{
snum = 0;
for(int i = 0; i < strlen(num); i++)
{
snum += num[i] - '0';
}
if(snum < 10) {printf("1\n"); continue;}
int i;
for( i = 2; ; i++)
{
snum = fun(snum);
if(snum < 10) break;
}
printf("%d\n", i);
}
}
return 0;
}