答案:
#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
。