打印1-10位的 没有重复数字的 自然数字列表
我的代码效率很差7位以上基本上就处于死机状态了
写在这里只为抛砖引玉
求高手指点好的算法……
程序代码:/* 打印 1 - 10 位各数字位上没有重复数字的自然数 */
#include <stdio.h>
#include <math.h>
#include <time.h>
long long min[11] = {
0, 0, 10, 102, 1023, 10234, 102345, 1023456,
10234567, 102345678, 1023456789
}, max[11] = {
0, 9, 98, 987, 9876, 98765, 987654, 9876543,
98765432, 987654321, 9876543210
};
long long ten_pow(int n);
void foo(int);
int main(void) {
clock_t begin, end;
int i = 0, n;
scanf("%d", &n);
if(n < 1 || n > 10) return 1;
begin = clock();
while(++i <= n) foo(i);
end = clock();
printf("\n%f\n", (double)(end - begin) / CLOCKS_PER_SEC);
return 0;
}
long long ten_pow(int n) {
long long v = 1;
while(n-- > 0) v *= 10;
return v;
}
void foo(int n) {
int i, j, p;
while(min[n] <= max[n]) {
for(i = 0; i < n - 1; i++) {
p = min[n] / ten_pow(i) % 10;
for(j = i + 1; j < n; j++) {
if(p == min[n] / ten_pow(j) % 10)
break;
}
if(j < n) break;
}
if(i < n - 1) min[n]++;
else printf("%lld ", min[n]++);
}
}









