一个例题:求最小生成元
如果一个数x加上x的各位数字的和得到y,就说x是y的生成元。
给出一个n(1<=n<=100000), 求它的最小生成元,无解时输出0。
如:输入 216 输出 198 输入 2005 输出 1979 输入 121 输出 0。
首先从思路上容易想到,我们要找一个数(n)的生成元,
这个生成元毫无疑问比这个数(n)小,
那么我们只需把1到n-1的所有数都枚举一遍找到就break就行,
最后输出相应数据。
但是每求一个n的生成元都要枚举n-1个数(在最糟的情况下),
我们可以换一种思路,把所有可以是生成元的数从1到100000都算出来他们对应的数并且把他们存入一个数组且相应的位置下标即为这个数n。
这样做相当于我们制作了一个生成元的表格,最后只需要查表即可。
#include<cstdio> #include<cstring> #define maxn 100005 int ans[maxn]; int main(){ int T,n; memset(ans,0,sizeof(ans)); for(int m=0;m<maxn;m++){ int x=m,y=m; while(x>0){ y+=x%10; x/=10; } if(ans[y]==0||m<ans[y]){ ans[y]=m; } } scanf("%d",&T); while(T--){ scanf("%d",&n); printf("%d/n",ans[n]); } return 0; }
memset是C++初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/276750.html