算法竞赛入门

例题3-5 生成元(Digit Generator)

如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1<=n<=100000),求最小生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。

//得出的条件有
//给出n 求最小生成元 设为m 且m < n
//无解输出0

# include <stdio.h>
# include <string.h>
# define maxn 100005
int a[maxn];//定义生成元数组
void generate() //一次性枚举所有生成元,也称打表操作 
{
	int x, y, m;
	memset(a, 0, sizeof(a));
	for(m = 1; m < maxn; m++)
	{
		;
		int x = m, y = m;
		while(x > 0)
			{
			//表示y = x加上x的各个数字之和
				y += x%10;
				x /= 10;
			}
//如果生成元数组上值为零或者生成元小于它,则生成元m赋给a[y]
		if(a[y] == 0 || m < a[y]) 
			a[y] = m;
	}
 } 

int main()
{
	generate();
	int T, n;
	scanf("%d", &T);
	while(T--) // 规定输入的元素个数 
	{
		scanf("%d", &n);
		printf("%d\n", a[n]);//a[n]目的是查询  生成元数组中的生成元 
	}
	return 0;
 } 
 //具体得看题目要求的输入输出格式 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值