zoukankan      html  css  js  c++  java
  • USACO 1.3.4 Prime Cryptarithm 牛式(模拟枚举)

    Description

    下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。

          * * *
       x    * *
        -------
          * * *
        * * *
        -------
        * * * *
    

    数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0。

    注意一下在美国的学校中教的“部分乘积”,第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积.

    写一个程序找出所有的牛式。

    Input

    Line 1:数字的个数n。 Line 2:N个用空格分开的数字(每个数字都∈ {1,2,3,4,5,6,7,8,9})。

    Output

     共一行,一个数字。表示牛式的总数。
    
     下面是样例的那个牛式。
    
            2 2 2
          x   2 2
        ---------
            4 4 4
          4 4 4
        ---------
         4 8 8 4
    

    Sample Input

    5
    2 3 4 6 8
    

    Sample Output

    1


    解题思路:纯粹的暴力枚举一下即可,不过为了提高代码效率,我们可以将查找判断该数的组成数是否给定集合写成一个函数。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int vis[10];
     7 int judge(int x)
     8 {
     9     int k;
    10     while(x)
    11     {
    12         k=x%10;
    13         if(!vis[k])
    14         {
    15             return 0;
    16         }
    17         x=x/10;
    18     }
    19     return 1;
    20 }
    21 int main()
    22 {
    23     int n,i,j,x,y,counts,a;
    24     scanf("%d",&n);
    25     memset(vis,0,sizeof(vis));
    26     for(i=0; i<n; i++)
    27     {
    28         scanf("%d",&a);
    29         vis[a]=1;///记录可以出现的数
    30     }
    31     counts=0;
    32     for(i=100; i<=999; i++)///牛式第一行
    33     {
    34         if(judge(i))
    35         {
    36             for(j=10; j<=99; j++)///牛式第二行
    37             {
    38                 if(judge(j))
    39                 {
    40                     if(i*j>9999)
    41                     {
    42                         continue;
    43                     }
    44                     x=j/10;
    45                     y=j%10;///牛式三四行
    46                     if(x*i>999||y*i>999)
    47                     {
    48                         continue;
    49                     }
    50                     if(judge(i*j)&&judge(x*i)&&judge(y*i))///牛式第五行
    51                     {
    52                         counts++;
    53                     }
    54                 }
    55             }
    56         }
    57     }
    58     printf("%d
    ",counts);
    59     return 0;
    60 }
  • 相关阅读:
    Linux sed命令实例详解
    hadoop2.0 和1.0的区别
    linux如何修改主机名
    hadoop主节点(NameNode)备份策略以及恢复方法
    Hadoop 添加删除数据节点(datanode)
    Hadoop常见错误及处理方法
    【转】ImageView.ScaleType属性
    MonoBehaviour.print和Debug.Log是同样的作用
    unity自带寻路Navmesh入门教程
    前向渲染路径细节 Forward Rendering Path Details
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9705691.html
Copyright © 2011-2022 走看看