答案:
#include<bits/stdc++.h>
using namespace std;
const int N=10e7;
int fx(int n)
{int sum=0;while(n){sum+=(n%10);n/=10;}return sum;
}
int main()
{int t,n,x;cin>>t;while(t--){cin>>n;int count=0;for(int i=1;i<N;){if(i==n){cout<<count<<'\n';break;}else if(i>n){cout<<-1<<'\n';break;}x=fx(i);i=(i+x);count++;}
}return 0;
}
代码的逻辑:
- 函数
fx
计算一个整数n
的各位数字之和。 - 主函数中首先读取测试案例数量
t
,然后对于每个测试案例,读取目标值n
。 - 代码使用一个
for
循环从i = 1
开始,逐步计算下一个值i
,直到i
等于或大于n
。
假设 n = 5
,代码的执行过程如下:
t = 1
(一个测试案例)n = 5
(目标值)- 初始化
count = 0
,i = 1
进入 for
循环:
-
第一轮循环:
i = 1
- 计算
x = fx(1) = 1
- 更新
i = i + x = 1 + 1 = 2
count++
(count = 1
)
-
第二轮循环:
i = 2
- 计算
x = fx(2) = 2
- 更新
i = i + x = 2 + 2 = 4
count++
(count = 2
)
-
第三轮循环:
i = 4
- 计算
x = fx(4) = 4
- 更新
i = i + x = 4 + 4 = 8
count++
(count = 3
)
-
第四轮循环:
i = 8
- 这时
i > n
,所以输出-1
,并退出循环。
因此,对于 n = 5
,程序将输出 -1
。
我们再通过另一个例子 n = 10
来分析:
t = 1
(一个测试案例)n = 10
(目标值)- 初始化
count = 0
,i = 1
进入 for
循环:
-
第一轮循环:
i = 1
- 计算
x = fx(1) = 1
- 更新
i = i + x = 1 + 1 = 2
count++
(count = 1
)
-
第二轮循环:
i = 2
- 计算
x = fx(2) = 2
- 更新
i = i + x = 2 + 2 = 4
count++
(count = 2
)
-
第三轮循环:
i = 4
- 计算
x = fx(4) = 4
- 更新
i = i + x = 4 + 4 = 8
count++
(count = 3
)
-
第四轮循环:
i = 8
- 计算
x = fx(8) = 8
- 更新
i = i + x = 8 + 8 = 16
count++
(count = 4
)
-
第五轮循环:
i = 16
- 这时
i > n
,所以输出-1
,并退出循环。
对于 n = 10
,程序同样输出 -1
。