跳至正文

USACO 1.3.4 Prime Cryptarithm

  • OI路程

  我没找到什么很巧的方法,纯暴力搜索:
  枚举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;
}

发表回复

您的电子邮箱地址不会被公开。