1. 程式人生 > >演算法競賽入門經典-例題3-5-生成元

演算法競賽入門經典-例題3-5-生成元

題目描述

生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)
如果x加上x的各個數字之和得到y,就說x是y的生成元。給出n(1≤n≤100000),求最小生成元。無解輸出0。例如,n=216,121,2005時的解分別為198,0,1979

分析

  1. 思路一:假設所求生成元為m。不難發現m<n。換句話說,只要列舉所有的m<n,看看有沒有哪個數是n的生成元。
  2. 只需要一次性列舉100000內的所有正整數m,標記“m加上m的各個數字之和得到的數有一個生成元是m”,最後查表。
#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; }