【蓝桥杯】 2017初赛 9数算式/next-permutation/小技巧

题目描述

观察如下的算式:9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:

  1. 总数目包含题目给出的那个示例。
  2. 乘数和被乘数交换后作为同一方案来看待。

输出

输出一个整数表示答案

【蒟蒻的辣鸡解题之路】
1.乍一看,啊,好简单,next_permutation搞一搞!然后现实被定式思维一锁,认为两个相乘的数只能是四位和五位。仔细审题后,炸裂啊
2.嗯看清题目后知道要枚举了,但是有一个问题,就是怎么排掉那些重复的呢,好办鸭,把这个两个数顺着倒着存进map数组里,但是最后发现结果少了两个
4.大意了!用上面的方法存,只能存下顺序,很有可能同样一串,但是位数不一样即一串代表的式子不一定是一串昂。所以可以用一个0来隔开两个数,真的美妙,记下来记下来!

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef map<ll,int> mp;
int a[10]={1,2,3,4,5,6,7,8,9};
int vis[13];
mp all;
int main()
{
    int ans=0;
    do{
            //cout<<"-----"<<endl;
           for(int w=1;w<=8;w++)
           {
               ll aa=0;
               ll aax=0;
               ll b=0;
               ll bx=0;
               for(int i=0;i<w;i++)
               {
                   aa=aa*10+a[i];

               }
               for(int i=w;i<9;i++)
               {
                   b=b*10+a[i];
               }
               aax=aa*pow(10,9-w+1)+b;//来记录两个数分别是什么
               bx=b*pow(10,w+1)+aa;
               //cout<<aax<<bx<<endl;
               ll tem=aa*b;
               memset(vis,0,sizeof(vis));
               int f=1;
               int cnt=0;//感觉判断有点啰嗦
               while(tem)
               {
                   int hh=tem%10;
                   vis[hh]++;
                   tem=tem/10;
                   cnt++;
               }
               if(cnt!=9)
                continue;
               for(int i=1;i<=9;i++)
               {
                   if(vis[i]!=1)
                   {
                       f=0;
                       break;
                   }
               }
               if(f==1&&all[aax]==0&&all[bx]==0)
               {
                   ans++;
                   all[aax]=1;
                   all[bx]=1;
               }

            }

   // ans++;
    }while(next_permutation(a,a+9));
     //cout<<"9!="<<9*8*7*6*5*4*3*2<<endl;
      cout<<ans<<endl;
}

answer:1625

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值