题目不再写入了,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=;i<max;i++)
{
int x=i;int y=i;
while(x) {y+=x%;x/=;}
if(a[y]==||i<a[y]) a[y]=i;
}
int p,b;
cin>>p;
while(p--)
{
cin>>b;
cout<<a[b]<<endl;
}
}
这种思想应该得注意!!!直接预处理。