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;
}