生成元


題目

如果x加上x的各個數字之后得到y,就說x是y的生成元。給出n(1<=n<=100000),

求最小生成元。無解輸出0。例如,n=216,121,2005時的解分別為198,0,1979。

 

分析

假設所求生成元為m。不難發現m<n。即只需枚舉所有的m<n,看看有沒有哪個數是n的生成元。

但是,這樣做效率較低。因為每一次計算一個n的生成元都需要枚舉n-1個數。

更好的方法;我們可以一次枚舉100000內的所有正整數m,標記“m加上m的各個數字之和得到的數有一個生成元是m”,最后查表即可。

 

c實現

#include<stdio.h> 
#include<string.h>
#define maxn 100005
int ans[maxn];

int main()
{
    int T,n;
    memset(ans,0,sizeof(ans));
    for(int m=1;m<maxn;m++)
    {
        int x=m,y=m;
        while(x>0)
        {
            y+= x%10;
            x /=10;
        }
        if(ans[y]==0||m<ans[y]) ans[y]=m;
    }
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        printf("%d\n",ans[n]);
    }
    return 0;
}

//這里直接一次枚舉100000以內的所有整數,之后通過查表取出結果。
//避免每次求n的生成元,都需要枚舉n-1個數 

這里的T指的是進行多少次查詢。

效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM