安徽大学第九届大学生程序设计竞赛 网络预选赛 B - 迭代归一

本文介绍了一种将多位正整数通过迭代变换直至变为一位数的算法,并提供了一个具体的实现案例,包括输入输出示例及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B. 迭代归一
Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 323   Submission Accepted: 74
Description
我们把一个正整数的每一位上的数字加起来,得到新的数字,我们把这样的一次操作称为一次迭代变换。直到这个数字只有一位数。
如,9876经过一次变换成为9+8+7+6=30,经过第二次变换成为3+0=3,结束。
那么9876就经过了两次迭代变换。如今给一个正整数,问需要迭代变换多少次后会停止。

Input
一个整数t,表示测试数据组数(1<=t<=100)。
对于每组测试数据,只有一行,表示一个正整数,正整数最多有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值