UVa1583 Digit Generator另一种解法

来源:互联网 发布:网络h小说合集 编辑:程序博客网 时间:2024/05/29 04:18

紫书上的解法:枚举100000内的所有正整数m的最小生成元,然后查表即可。

之前一看到这个题目就想到了另一个方法:

       简单分析一下,题目中给出 n 的范围是 [ 1, 100000 ],所以 n 的最小生成元 x 也必定在这个区间中,那么 x 与 n 最多差多少呢?易知为 45 ,所以对于任意的 n ,我们只须遍历其前 45 个元素即可。

       代码如下:

#include <stdio.h>

int main(void)
{
    int T;
    scanf("%d", &T);
    while(T--) {
        int n, i;
        scanf("%d", &n);
        for(i = n - 45; i <= n; ++i)
            if(n == i + sum(i))  { printf("%d\n", i); break; }
        if(i > n)   printf("%d\n", 0);
    }
    return 0;
}

int sum(int n) {
    int a = 0;
    while(n > 0) {
        a += n%10;
        n /= 10;
    }
    return a;
}