如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小
生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。
#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
int a[100005];
memset(a,0,sizeof(a));
for(int i=1;i<100005;i++)//先做好表,方便以后查找;
{
int all=i;
int weishu=i;
while(weishu!=0)
{
all+=weishu%10;
weishu/=10;
}
if(a[i]==0||i<a[all])a[all]=i;//如果下标为all的空间中有这个数而且这个数比i还要大,那么根据要求"最小生成元",要令下标为all的空间中存小的那个数;
}
int n;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d",a[n]);
}
}
此题不难,但是有个思维方法,就是如果需要测试的数量比较多,并且测试的方法都是同一种,那么完全可以用查表法;
但是应用查表法需要确定的是哪一个数来做下标,哪一个来做值;
就如上题:
但是应用查表法需要确定的是哪一个数来做下标,哪一个来做值;
就如上题:
上图中上面的数组和下面的数组所设计出来的程序显然是不一样的,要结合实际来判断哪一中更好一点;