【题目描述】
如果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