随笔 - 6, 文章 - 5, 评论 - 0, 引用 - 0
数据加载中……

[USACO]Prime Cryptarithm

根据数据  可以得出一个三位数乘一个两位数,那么111 <= i <= 999  ,  11 <= j <= 99,且相乘分布和与乘积均为可找到数,枚举判断即可。

#include <stdio.h>
int count;
int hash[10];

void
init()
{
      int z,i,n;
      freopen("crypt1.in","r",stdin);
      scanf("%d",&n);
      for(i=1;i<=n;i++)
          {
                       scanf("%d",&z);
                       hash[z] = 1;
          }
}

int
pd(int a)
{
    while(a > 0)
    {
            if(!hash[a % 10])return 0;
            a/=10;
    }
    return 1;   
}

void
Enum()
{
      long  a,b,s,i,j;
     
      for(i = 111 ;i <= 999;i++)
          for(j = 11 ;j <= 99;j++)
              {
                  s = i * j;
                  if(s <= 9999)
                  {
                       a = i * (j % 10);
                       b = i * (j / 10);
                       if(pd(i) && pd(j) && pd(s) && pd(a) && pd(b) && a<1000 && b<1000)count++;
                  }
              }
    
}
   
void
write()
{
       freopen("crypt1.out","w",stdout);
       printf("%ld\n",count);
}          
     
int
main()
{
      init();
      Enum();
      write();
      return 0;
}

PS:
1,应注意   对于每个分步和也要在可招数内。
2,分布和为三位数
3,因为C的全局变量特点,初始为0,则可以避免相乘里有0的可能。
     

posted on 2012-09-07 20:17 slytherin 阅读(109) 评论(0)  编辑 收藏 引用 所属分类: USACO


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理