题目不再写入了,vj:https://vjudge.net/problem/UVA-1583#author=0
主要讲的是找一个数的小于它的一个数,小于它的那个数每一位加起来再加上那个数就会等于原来的数。没有就是0.
这个题实际上感觉也直接暴力for就行。数最大是1e5.那么最多5个9那么就是45,直接用stringstream或者其他的方法进行分位然后寻找就行。
找到就break那么这个数就是最小的。
刘汝佳的做法是直接预处理一个数组然后根据数组找数,实在是感觉非常的高明,同时代码量也比较小。
代码:
#include <iostream> using namespace std; #define max 100010 int a[max]; main() { for(int i=1;i<max;i++) { int x=i;int y=i; while(x) {y+=x%10;x/=10;} if(a[y]==0||i<a[y]) a[y]=i; } int p,b; cin>>p; while(p--) { cin>>b; cout<<a[b]<<endl; } }
这种思想应该得注意!!!直接预处理。