【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108434
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

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

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

数字只能取代*,当然第一位不能为0。

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

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

INPUT FORMAT:

(file crypt1.in)

Line 1:数字的个数n。

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

OUTPUT FORMAT:

(file crypt1.out)

共一行,一个数字。表示牛式的总数。

下面是样例的那个牛式。
      2 2 2
    x   2 2
     ------
      4 4 4
    4 4 4
  ---------
    4 8 8 4

input:
5
2 3 4 6 8

output:
1

【参考程序】:

/*
ID: XIONGNA1
PROG: crypt1
LANG: C++
*/
#include
<iostream>
#include
<cstring>
using namespace std;
int n,ans;
int a[10];
bool bo[11];
bool check(int s)
{
    
int t;
    
while (s)
    {
        t
=s%10;
        
if (!bo[t]) return false;
        s
=s/10;
    }
    
return true;
}
int main()
{
    freopen(
"crypt1.in","r",stdin);
    freopen(
"crypt1.out","w",stdout);
    scanf(
"%d",&n);
    memset(bo,
false,sizeof(bo));
    
for (int i=1;i<=n;i++)
    {
        scanf(
"%d",&a[i]);bo[a[i]]=true;
    }
    n
=0;
    
for (int i=1;i<=9;i++)
        
if (bo[i])
        {
            n
++;a[n]=i;
        }
    ans
=0;int res1,res2,res3,xx;
    
bool bk;
    
for (int x1=1;x1<=n;x1++)
        
for (int x2=1;x2<=n;x2++)
            
for (int x3=1;x3<=n;x3++)
            {
                
for (int x4=1;x4<=n;x4++)
                {
                    
for (int x5=1;x5<=n;x5++)
                    {
                        bk
=true;
                        xx
=a[x1]*100+a[x2]*10+a[x3];
                        res3
=xx*(a[x4]*10+a[x5]);
                        
if (res3>9999)
                        {
                            bk
=false;break;
                        }
                        
if (!check(res3)) continue;
                        res2
=xx*a[x4];
                        
if (res2>999continue;
                        
if (!check(res2)) continue;
                        res1
=xx*a[x5];
                        
if (res1>999continue;
                        
if (!check(res1)) continue;
                        ans
++;
                    }
                    
if (!bk) break;
                }
                
if (!bk) continue;
            }
    printf(
"%d\n",ans);
    
return 0;
}


 

 

posted on 2009-07-15 13:55 开拓者 阅读(301) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解

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