生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

来源:互联网 发布:mmd恋爱循环数据 编辑:程序博客网 时间:2024/05/01 04:06

如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小生成元。无解输出0。

输入:
3
216
121
2005

输出:
198
0
1979

分析:
一次性枚举100000内的所有正整数m,标记“m加上m的各个数字之和得到的数有一个生成元是m”,最后查表即可。

代码:

#include<stdio.h>#include<string.h>#define MAXN 100010int s[MAXN];int main() {    int i = 0;    memset( s, 0, sizeof(s));    for(i = 1; i < MAXN; ++i) {        int x = i, y = i;        while(y > 0) { x += y % 10; y /= 10;}//i是x的生成元        if(s[x] == 0 || i < s[x]) s[x] = i;//求x的最小生成元    }    int m, n;    scanf("%d", &m);    while(m--) {        scanf("%d", &n);        printf("%d\n", s[n]);    }    return 0;}

注意:
if(s[x] == 0 || i < s[x]) s[x] = i; 中 i < s[x], 要判断是否为最小生成元

0 0
原创粉丝点击