For example, the digit-sum of 245 is 256 (= 245 + 2 + 4 + 5). Therefore, 245 is a generator of 256.
Not surprisingly, some numbers do not have any generators and some numbers have more than one generator. For example, the generators of 216 are 198 and 207.
You are to write a program to find the smallest generator of the given integer.
Input
Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case takes one line containing an integer N, 1 ≤ N ≤ 100,000.
Output
Your program is to write to standard output. Print exactly one line for each test case. The line is to contain a generator of N for each test case. If N has multiple generators, print the smallest. If N does not have any generators, print 0.
The following shows sample input and output for three test cases.
Sample Input
3 216 121 2005
Output for the Sample Input
198 01979
解题报告:
这个题一开始自己写的在uva上交总是超时,我又在天大的交了一下,竟然过了。
由此可知天大的数据多弱。。。。。可以看出来uva是最古老最权威的一个oj是对的。。
检查数据的时候,这个题是用的打表法,先把1-100000的结果存在数组里面,然后再查表即可。但是我一开始就输入了测试样例,然后在每个测试样例里面嵌套存表,忽然一想,这样如果数据大了,就是每重新一组数据都要打表算一次,这样如果有多组数据的话,肯定会TLE的,然后赶紧改了,就a了。。。。
这个题因为数组开得还是比较大的,如果放在main里面定义容易打开编辑框就直接退出,之前有过经验,所以定义了大数组,最好还是定义在外面。。。
还有这个题的需要注意的地方是if判断的那个位置,把相加得到的数作为数组元素的下标,因为要求的数是原数,小的那个,所以把原数作为数组元素存起来,然后判断下标和要求输入的数是否一样,一样的话就直接输出元素的值。。。
其实代码很简单,不过这种处理还是要想到。。。形成这种知道怎么处理问题的模式比较好。。。
上代码:
#include <cmath> #include <ctime> #include <cctype> #include <climits> #include <cstdio> #include <cstdlib> #include <cstring> #include <map> #include <set> #include <queue> #include <stack> #include <string> #include <vector> #include <sstream> #include <iostream> #include <algorithm> #define INF (INT_MAX / 10) #define clr(arr, val) memset(arr, val, sizeof(arr)) #define pb push_back #define sz(a) ((int)(a).size()) using namespace std; typedef set<int> si; typedef vector<int> vi; typedef map<int, int> mii; typedef pair<int, int> pii; typedef long long ll; const double esp = 1e-5; #define N 100000+10 int a[N]; int main() { int i,T,n,sum; memset(a,0,sizeof(a)); for(i=1;i<100000;i++) { sum=i; int m=i; while(m) { sum+=m%10; m/=10; } if(a[sum]==0||a[sum]>i) a[sum]=i; } scanf("%d",&T); while(T--) { scanf("%d",&n); printf("%d\n",a[n]); } return 0; }