刘汝佳算法书—生成元
#include<stdio.h>
#include<string.h>
#define max 100005
int ans[max];
int main( )
{
int T,n;
memset(ans,0,sizeof(ans));
for(int i =1; i < max;i++)
{
int a = i,y = 0;
while(a > 0)
{
y += a % 10;
a = a / 10;
}
y = y + i;
if(ans[y] == 0 || i < ans[y])//这个判断语句是为了让生成元取到最小值
{
ans[y] = i;//这里其实就是交换了位置,因为后面输出的就是生成元,i就是生成元(较小的那个),循环完成的任务就是计算生成元对应的数,大概可以折磨理解
}
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}
其实可以对于每个输入的数字,进行枚举从1···这个数-1,但是这样太麻烦,效率也不高,最好就是,先进行枚举,然后计算每一个数对应的生成元,又因为是数字,所以可以采用数字、组来完成记录,又因为输出的是小的生成元,所以计算出来后交换一下位置就可以了。