[蓝桥杯2017初赛]9数算式

题目描述

观察如下的算式:9213 x 85674 = 789314562 
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。 
而乘积恰好也是用到了1~9的所有数字,并且每个1次。 
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个? 
注意: 
1. 总数目包含题目给出的那个示例。 
2. 乘数和被乘数交换后作为同一方案来看待。 

输出

输出一个整数表示答案

 

答案:1625

 

题解:全排列之后,用for循环枚举乘数和被乘数,用map标记符合条件的组合

 

#include<iostream>
#include<string>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<map>
#include<stack>
#include<queue>
#define ll long long
using namespace  std;
int vis[10];
map<ll,int>mp;
int main()
{
    int a[9]={1,2,3,4,5,6,7,8,9};
    int cnt=0;
    do
    {
        for(int i=1;i<9;i++)
        {
            ll ans,l=0,r=0,t=0,x=0,y=0;
            memset(vis,0,sizeof(vis));
            for(int j=0;j<=i;j++)
                l=l*10+a[j];
            x=l;
            x=x*10;
            for(int k=i+1;k<9;k++)
            {
                r=r*10+a[k];
                x=x*10+a[k];
            }
            y=r;
            y=y*10;
            for(int j=0;j<=i;j++)
                y=y*10+a[j];
            
            ans=l*r;
            ll ff=ans;
            while(ans)
            {
                int temp=ans%10;
                ans=ans/10;
                if(vis[temp]==0&&temp!=0)
                {
                    vis[temp]=1;
                    t++;
                }
            }
            if(t==9&&mp.count(x)==0&&mp.count(y)==0)
            {
                cnt++;
                mp[x]=1;
                mp[y]=1;
                //cout<<l<<"   "<<r<<"    "<<ff<<endl;
            }
        }
    }while(next_permutation(a,a+9));
    cout<<cnt<<endl;
    return 0;
}

 

posted @ 2020-02-22 15:55  知道了呀~  阅读(656)  评论(0编辑  收藏  举报