【紫书】例题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

 1 #include <iostream>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     int n = 0;
 9     while ( scanf ("%d", &n) == 1) {
10         int flag = 1;
11         for ( int i = 1; i <= n; i++ ) {
12             int t = i, sum = 0;
13             while ( t > 0 ) {
14                 sum += t % 10;
15                 t /= 10;
16             }
17 //            printf ("i = %d, sum = %d\n", i, sum);
18             if ( i + sum == n ) {
19                 printf ("%d\n", i);
20                 flag = 0;
21                 break;
22             }
23         }
24         if ( flag ) printf ("0\n");
25     }
26
27 //    printf ("Time used = %f\n", (double)clock() / CLOCKS_PER_SEC);
28
29     return 0;
30 }

  方法2

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 #define MAX (int)1e5 + 10
 5
 6 using namespace std;
 7
 8 int a[MAX];
 9
10 int main()
11 {
12     for ( int i = 1; i < MAX; i++ ) {
13         int t = i, j = i;
14         while ( t ) {
15             j += t % 10;
16             t /= 10;
17         }
18         if ( a[j] == 0 || a[j] > i ) a[j] = i;
19     }
20
21      int n = 0;
22      while ( scanf ("%d", &n) == 1 ) printf ("%d\n", a[n]);
23
24     return 0;
25 }

【总结】

自己的方法是纯暴力枚举,真的简单。。但对一个数进行按位拆分的时候写的麻烦了。。明明很久以前就写过的OTL。

作者的方法是,先用一个数组将所有下标对应的最小生成元都存起来,最后输入只要查表即可。比单纯的暴力枚举要高效很多,不必每次输入n都从1~n-1找一遍。妙啊,巧用数组!

原文地址:https://www.cnblogs.com/lilinilil/p/8450171.html

时间: 2024-10-11 21:19:53

【紫书】例题3-5 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)的相关文章

最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

Question 例题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. Think 方法一:假设所求生成元记为m,不难发现m<n.换句话说,只需枚举所有的m<n,看看有木有哪个数是n的生成元.此举效率不高,因为每次计算一个n的生成元

生成元(Digit Generator,ACM/ICPC Seoul 2005, UVa1583)

For a positive integer N , the digit-sum of N is defined as the sum of N itself and its digits. When M is the digitsum of N , we call N a generator of M . For example, the digit-sum of 245 is 256 (= 245 + 2 + 4 + 5). Therefore, 245 is a generator of

Digit Generator, ACM/ICPC Seoul 2005, UVa1583

For a positive integer N, the digit-sum of N is defined as the sum of N itself and its digits. When M is the digitsum of N, we call N a generator of M. For example, the digit-sum of 245 is 256 (= 245 + 2 + 4 + 5). Therefore, 245 is a generator of 256

生成元(Digit Generator,ACM/ICPC Seoul 2005,UVa 1583)

#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int t, n, a, b, ans, l;int main(){ scanf("%d", &t);//这句话是为了确定一个最大的范围,比如说10000 while (t--) { scanf("%d", &n); ans = 0; for (int i = n - 50;

生成元(Digit Generator ,ACM/ICPC Seoul 2005 ,UVa 1583)

生成元:如果 x 加上 x 各个数字之和得到y,则说x是y的生成元. n(1<=n<=100000),求最小生成元,无解输出0. 例如:n=216 , 解是:198 198+1+9+8=216 解题思路:打表 循环将从1到10005(大点也可以)进行提前写好. 例如: 1  1+1=2,-->  arr[2]=1 13 13+1+3=17,-->arr[17]=13 34  34+3+4=41, -->arr[41]=34 打完表后,直接将给的数作为下标,输出即可. #inc

紫书例题6-3 (UVa 442)

题目地址:https://vjudge.net/problem/UVA-442 题目大意:汗颜,其实我是直接看紫书的中文题意的,大意就是计算两个矩阵乘法次数,设计线性代数知识,可自己百度矩阵乘法. 思路:栈+模拟,左括号开始入栈,右括号开始计算栈顶两个矩阵的乘法次数然后再将新矩阵的n,m入栈即可. AC代码: #include <iostream> #include <string> #include <stack> #include <cstring> u

紫书例题6-4 (UVa 11988)

题目链接:https://vjudge.net/problem/UVA-11988 题目大意:输入一串字符,并按照要求输出,遇到'['字符就将光标移动到开头,遇到']'字符就将光标移动到末尾. 思路: 题目不难懂,很明显的一个模拟就行,重点是如何取存储,这里选择使用链表,链表的具体定义可以去百度看一下,这里不做过多解释,可以简单理解为一个未知长度的数组,它可以借助指针在任意位置插入(删除). 这题具体的操作可以用草稿纸模拟一遍,我是看一位博主的blog明白的,原blog地址:https://bl

例题 3-5 生成元 digit generator

1 #include<stdio.h> 2 #include<string.h> 3 #define maxn 100005 4 int ans[maxn]; //类似于 比较大的数组还是开导外面比较好一点,防止报错. 5 int main() 6 { 7 int x,y,m,T,n; 8 memset(ans,0,sizeof(ans)); //数组归零. 9 for(m=1;m<maxn;m++) //从 1 开始 遍历到 maxn. 10 { 11 x=y=m; //

【紫书】例题3-6 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)

[题目描述] 长度为n的环状串有n种表示法,分别为某个位置开始顺时针得到.例如,图中的环状串有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等.在这些表示法中,字典序最小的称为"最小表示". 输入一个长度为n(n<=100)的环状DNA串(只包含A.C.G.T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示.例如,CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC. 输入: 在输入文件的第一行 为序列数量.