我没找到什么很巧的方法,纯暴力搜索:
枚举100~999,10~99然后再分别进行判断,是各个数值否是在范围内,然后是否是输入输入的集合,如果都是ans递增,代码就是这样,犯了两个错误!
1、在比较是否属于全集时,我是判断如果都不属于才算不属于,即用的“与”进行连接,应用“或”连接,在有一个不属于全集时就算不属于了。
2、在判断是否是千位数时我用的是i >= 999,应该用i>999。
不过都是打代码就发现的问题,所以一次性AC!
ID: yylogoo2
PROG: crypt1
LANG: C
/
#include <stdio.h>
int num[9];
int used[10];
int n;
int ans;
int tmp[2];
void count(int a, int b)
{
int i, j;
/
Mistack 1:
下面用错逻辑符号了,改用||而用了&&
/
if(!check(a) || !check(b)){
return;
}
i = a (b % 10);
j = a (b / 10);
/
Mistack 2:
不允许为千位数,但是允许为999。
/
if((i > 999) || (j > 999)){
return ;
}
if(!check(i) || !check(j)){
return ;
}
i = a b;
if((i >= 1000) && (i <= 9999) && check(i)){
ans++;
}
}
int check(int k)
{
while(k != 0){
if(!used[k % 10]){
return 0;
}
k /= 10;
}
return 1;
}
int main(void)
{
int i, j;
freopen("crypt1.in", "r", stdin);
freopen("crypt1.out", "w", stdout);
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &num[i]);
used[num[i]] = 1;
}
for(i = 100; i <= 999; i++){
for(j = 10; j <= 99; j++){
if(i j > 9999){
break;
}
count(i, j);
}
}
printf("%d\n", ans);
return 0;
}