学习

    xiaoxiao2022-07-13  169

    生成元

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

    输入演示

    3 216 121 2005 (注意:第一行输入代表将要输入的实验数据组数。)

    输出演示

    198 0 1979

    分析

    本题看起来是个数学题,实则不然。假设所求生成元为m。不难发现m<n。换句话说, 只需枚举所有的数字m<n,看看有没有哪个数是n的生成元。 可惜这样做的效率并不高,因为每次计算一个n的生成元都需要枚举n-1个数。有没有更快的方法?当然有:只需一次性枚举100000内的所有正整数m,标记“m加上m的各个数字之和得到的数有一个生成元是m”,最后查表即可。

    代码展示

    #include<iostream> #define maxn 100005 int ans[maxn]; using namespace std; int main() { int T, n; memset(ans, 0, sizeof(ans));//memset函数是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 for (int m = 1; m<maxn; m++) { int x = m, y = m; while (x>0) { y += x % 10; x = x / 10; } if (ans[y] == 0 || ans[y]>m) { ans[y] = m; } } cin >> T;//表示将要输入几组实验数据 int *a = new int[T]; for (int j = 0; j < T; j++) { cin >> n; a[j] = n; } for (int j = 0; j < T; j++) { n = a[j]; cout << ans[n] << endl; } return 0; }
    最新回复(0)