原题及翻译

For a positive integer N , the digit-sum of N is defined as the sum of N itself and its digits.
对于正整数n,n的位数和定义为n本身及其位数的和。
When M is the digitsum of N , we call N a generator of M .
当M是n的位数,我们称n为m的生成器。
For example, the digit-sum of 245 is 256 (= 245 + 2 + 4 + 5).
例如,245的数字和为256(=245+2+4+5)。
Therefore, 245 is a generator of256.
因此,245是256的生成器。
Not surprisingly, some numbers do not have any generators and some numbers have more than one generator.
不足为奇,有些数字没有任何生成器,有些数字有多个生成器。
For example, the generators of 216 are 198 and 207.
例如,216的生成器是198和207。
You are to write a program to find the smallest generator of the given integer.
您要编写一个程序来查找给定整数的最小生成器。

Input

输入
Your program is to read from standard input.
您的程序将从标准输入中读取。
The input consists of T test cases.
输入由T测试用例组成。
The number of test cases T is given in the first line of the input.
测试用例数t在输入的第一行给出。
Each test case takes one line containing an integer N , 1 ≤ N ≤ 100, 000.
每个测试用例取一行,包含一个整数n,1≤n≤100000。

Output

输出
Your program is to write to standard output.
您的程序将写入标准输出。
Print exactly one line for each test case.
每个测试用例只打印一行。
The line is to contain a generator of N for each test case.
对于每个测试用例,该行包含一个n的生成器。
If N has multiple generators, print the smallest.
如果n有多个生成器,请打印最小的。
If N does not have any generators, print ‘0’.
如果n没有任何生成器,请打印“0”。

Sample Input

3
216
121
2005

Sample Output

198
0
1979

思路

1.第一个想到的就是,暴力枚举,一开始写的是六层循环,作死的节奏,结果肯定是超时的,然后再把循环层数减到两层,从1枚举到最大值,但是每次枚举都要与n个数判断是否符合条件,时间复杂度O(n2),还是会超时,只有把时间复杂度降到O(n),才能AC。

2.枚举也有两种方法,第一种就是将1~ max枚举然后分别判断,第二种是将1~ 100000的所有生成元与其数字对应,没有生成元的就标为0,然后分别输入数字将其对应的生成元输出。

代码分析

先把超时的代码放出来,算法很简单,很好理解,但是,超时,不管怎样,没AC就是WA。

#include <stdio.h>
#include <string.h>
int main ()
{int n,max=0;scanf("%d",&n);int m[n];for(int i=0;i<n;i++){scanf("%d",&m[i]);if(m[i]>max) max=m[i];}int x[n],flag[n],index=0;memset(x,0,sizeof(x));memset(flag,0,sizeof(flag));for(int i=1;i<=max;i++){int a=i/100000%10,b=i/10000%10,c=i/1000%10,d=i/100%10,e=i/10%10,f=i/1%10;for(int j=index;j<n;j++){if(a*100000+b*10000+c*1000+d*100+e*10+f+a+b+c+d+e+f==m[j]){x[j]=a*100000+b*10000+c*1000+d*100+e*10+f;flag[j]=1;index++;}}}for(int i=0;i<n;i++){if(flag[i]==0) printf("0 \n");else printf("%d \n",x[i]);}return 0;
}

接下来看正确的结果:
1.创建一个全局变量的数组将从1~100000的所有生成元存储起来:

#define max 100000
int ans[max];

2.计算生成元并存储:

 for(int m=1;m<max;m++){//从1开始遍历int x=m,y=m;//x,y作为计算生成元的中间变量while(x>0){//将y分别与x的每一位相加,即生成元y+=x%10;x/=10;}if(ans[y]==0||ans[y]>m) ans[y]=m;//将即将输入的数字y与其生成元m对应}

完整代码

#include <stdio.h>
#include <string.h>
#define max 100000
int ans[max];
int main()
{int t,n;memset(ans,0,sizeof(ans));for(int m=1;m<max;m++){int x=m,y=m;while(x>0){y+=x%10;x/=10;}if(ans[y]==0||ans[y]>m) ans[y]=m;}scanf("%d",&t);while(t--){scanf("%d",&n);printf("%d\n",ans[n]);}return 0;
}

每天磕一道ACM 正月初三打卡

《算法竞赛入门经典》 例题3-5 生成元 (Digit Generator, ACM ICPC Seoul 2005,UVa)相关推荐

  1. 《算法竞赛入门经典》习题4-2 正方形 (Squares,ACM,ICPC World Finals 1990,UVa201)——仅提供大体方法

    原题及翻译 A children's board game consists of a square array of dots that contains lines connecting some ...

  2. 《算法竞赛入门经典》 习题4-1(象棋 Xiangqi ACM ICPC Fuzhou 2011,UVa1589)——仅提供大体方法

    原题及翻译 Xiangqi is one of the most popular two-player board games in China. 象棋是中国最流行的两人棋类游戏之一. The gam ...

  3. 例题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. 先附上自己的想法 ...

  4. 寻找生成元问题解决(Digit Generator,ACM/ICPC Seoul 2005, UVa1583)

    问题描述:如果x加上x的各个数字之和得到y,就说x是y的生成元.给出n(1<=n<=10000),求最小生成元.无解时输出0.例如 n = 216,121,2005 时的解分别为198,0 ...

  5. 古老的密码(Ancient Cipher,UVa1339)(算法竞赛入门经典 例题4-1)C++

    题目:给定两个不超过100的字符串,判断是否可以做到将其中一个字符串通过重排和映射的操作,使得两个字符串相同.例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后每个字母只要通过一次映射 ...

  6. 算法竞赛入门经典 例题6-6 小球下落(python、C)

    同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 问题描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从上到下从左到右编号为 1,2,3,- , ...

  7. 算法竞赛入门经典 例题6-2 铁轨(C、python)

    同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 问题描述: 某城市有一个火车站,铁轨铺设如图所示.有n节车厢从A方向驶入车站,按进站顺序编号为 1~n .你的任务 ...

  8. 算法竞赛入门经典 例题6-21

    UVa506 System Dependencies 编写程序实现类似Linux下的软件包管理器,其工作方式为: 可以通过命令显式安装组件,这个过程也可能隐式安装依赖组件 如果没有其它组件仍然依赖一个 ...

  9. 算法竞赛入门经典 例题6-16

    刷题荒废了一个多月,今日了却一件事情,把此题补上! UVa10129 Play on Words 有若干个圆盘,每个圆盘上都有一个单词,判断这些圆盘是否能排成一排,使得相邻圆盘的首尾字母相同. 3年前 ...

最新文章

  1. Spring Boot thymeleaf模版支持,css,js等静态文件添加
  2. python实现登录网站下载文件-Python爬虫 登录网页后下载图片,怎么保持登录状态?...
  3. 跳出小程序 video组件 卡顿、黑屏、全屏等坑
  4. hdu 4529(状态dp)
  5. doorway path issue of my task in HCP
  6. 实现简单的注解型MVC框架 —— 低配SpringMVC
  7. 4月30日火车票今日开售,多个线路“一秒没”
  8. 最简单上手的音频处理软件Cool Edit,这些操作你该知道
  9. gtest测试框架使用详解_python selenium自动化测试框架如何搭建使用?
  10. HTTP头域列表与解释 之 request篇
  11. Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别
  12. 光功率 博科交换机_博科光纤交换机zone划分命令方法
  13. PS CC2019新手必学基础(首选项)设置
  14. Apache虚拟主机配置之基于IP的虚拟主机实践
  15. 计算机视觉——Harris角点检测(课堂实验)
  16. ibm虚拟化 用的服务器品牌,浅析IBM i虚拟化技术
  17. ABP开发框架的总体介绍
  18. 前端面试题之浏览器系列
  19. 【Delphi】中使用消息Messages(五)Windows消息
  20. 如何区分np.random.normal()、np.random.randn()、np.random.randint()、np.random.random()、np.random.choice()

热门文章

  1. java按照字节切割字符串,解决汉字的问题
  2. noip2008普及组4题题解-rLq
  3. java的4种代码块
  4. ActionBarSherlock ViewPagerIndicator
  5. 博客园——记录我的开始
  6. 16个经典面试问题回答规律
  7. libsvm与python的使用
  8. Java黑皮书课后题第8章:***8.35(最大块)给定一个元素为0或者1的方阵,编写程序,找到一个元素都为1的最大的子方阵。程序提示用户输入矩阵的行数。然后显示最大的子方阵的第一个元素、行数
  9. 我的世界服务器盖亚3缴械修改,[管理]BossColing — 植魔盖亚 | 凋零末影龙召唤冷却时间及血量设置[1.7.10-1.12.2]...
  10. 项目第一天--ElementUI介绍