|-牛式-|

题目描述

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

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

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

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

输入格式

第一行一个整数 N ,代表数字的个数。

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

输出格式

一个数字。表示牛式的总数。

样例

输入数据 1

5
2 3 4 6 8

输出数据 1

1

样例解释

下面是样例的那个牛式:

      2 2 2
    x   2 2
     ------
      4 4 4
    4 4 4
  ---------
    4 8 8 4

这题看似很复杂,实则一点也不简单难,只需枚举竖式上面的五个数(第一第二行),再进行判断即可。直接枚举,最多需要9^5次,肯定不会超时。

AC代码

#include<bits/stdc++.h>
using namespace std;
bool flag[10];
int sum;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        int x;
        cin>>x;
        flag[x]=true;
    }
    for(register int i=1;i<=9;++i)
    {
        if(flag[i])
        {
            for(register int j=1;j<=9;++j)
            {
                if(flag[j])
                {
                    for(register int k=1;k<=9;k++)
                    {
                        if(flag[k])
                        {
                            for(register int m=1;m<=9;m++)
                            {
                                if(flag[m])
                                {
                                    for(register int n=1;n<=9;n++)
                                    {
                                        if(flag[n])
                                        {
                                            bool p=true;
                                            int s1=i*100+j*10+k,s2=m*10+n;
                                            int temp=s1*m;//判断第三行数字 
                                            while(temp>0)
                                            {
                                                if(temp>999)
                                                {
                                                    p=false;
                                                    break;
                                                }
                                                int x=temp%10;
                                                if(!flag[x])
                                                {
                                                    p=false;
                                                    break;
                                                }
                                                temp/=10;
                                            }
                                            if(!p)continue;
                                            temp=s1*n;//判断第四行数字 
                                            while(temp>0)
                                            {
                                                if(temp>999)
                                                {
                                                    p=false;
                                                    break;
                                                }
                                                int x=temp%10;
                                                if(!flag[x])
                                                {
                                                    p=false;
                                                    break;
                                                }
                                                temp/=10;
                                            }
                                            if(!p)continue;
                                            temp=s1*s2;//判断最后一行数字 
                                            while(temp>0)
                                            {
                                                if(temp>9999)
                                                {
                                                    p=false;
                                                    break;
                                                }
                                                int x=temp%10;
                                                if(!flag[x])
                                                {
                                                    p=false;
                                                    break;
                                                }
                                                temp/=10;
                                            }
                                            if(!p)continue;
                                            sum++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%d",sum);
    return 0;
}

好啦,今天就讲到这里,拜拜!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值