33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
The number n is called a generator of d(n). In the sequence above, 33 is a generator of 39, 39 is a generator of 51, 51 is a generator of 57, and so on. Some numbers have more than one generator: for example, 101 has two generators, 91 and 100. A number with no generators is a self-number. There are thirteen self-numbers less than 100: 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, and 97.
Write a program to output all positive self-numbers less than or equal 1000000 in increasing order, one per line.
Sample Output
1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
|
|
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=180
找出1000000以内所有不能由其他数字(abc+a+b+c)组成的数
因为a+b+c+...最大也就是9+9+9+9+9+9=54,所以直接暴力即可
#include<iostream> #include<algorithm> #include<string> #include<map> #include<cmath> #include<string.h> #include<stdlib.h> #include<cstdio> #define ll long long using namespace std; int main(){ for(int i=1;i<=1000000;++i){ int u=0; for(int j=1;j<=54&&i-j>0;++j){ int p=i-j,s=0; while(p>0){ s+=p%10; p/=10; } if(s==j){ u=1; break; } } if(u==0) cout<<i<<endl; } return 0; }不过上面的代码效率没有下面的高:
#include <cstring> #include <cstdlib> #include <cstdio> using namespace std; int hash[1000005]; void deal(int n){ int rec = n; while( n > 0 ){ int c = n % 10; n /= 10; rec += c; } hash[rec] = 1; } int main(){ for(int i=1;i<=1000000;++i){ if(!hash[i]) printf("%d\n",i); deal(i); } return 0; }