杨老师的游戏

链接: https://www.nowcoder.com/acm/contest/116/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

杨老师给同学们玩个游戏,要求使用乘法和减法来表示一个数,他给大家9张卡片,然后报出一个数字,要求大家用表达式的形式来表示出这个数
100 可以表示为这样的形式:100 = 129*67-8543 , 还可以表示为:100 = 13*489-6257
注意特征:表达式中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的表达式,100 有 20 种表示法。
题目要求:
从标准输入读入一个正整数N(N<1000 * 1000)
程序输出该数字用数码1~9不重复不遗漏地组成的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!

输入描述:

一个正整数N

输出描述:

输出有多少种表示法
示例1

输入

100

输出

20

备注:

注意只有一个乘法和一个减法,*号保证在-的前面
#include<iostream>
using namespace std;
int n,ans=0;
bool vis[10];
int num[10];
void cal(int x,int y){
    int a=0,b=0,c=0;
    for(int i=0;i<=x;i++){
        a=a*10+num[i];
    }
    for(int i=x+1;i<=y;i++){
        b=b*10+num[i];
    }
    for(int i=y+1;i<9;i++){
        c=c*10+num[i];
    }
    if((a*b-c)==n)
        ans++;
}
void solve(){
    for(int i=0;i<9;i++){
        for(int j=i+1;j<9;j++){
            cal(i,j);
        }
    }
}
void dfs(int d){
    if(d==9){
        solve();
        return;
    }
    for(int i=1;i<10;i++){
        if(!vis[i]){
            vis[i]=true;
            num[d]=i;
            dfs(d+1);
            vis[i]=false;
        }
    }
}
int main(){
    cin>>n;
    dfs(0);
    cout<<ans<<endl;
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans=0;
bool vis[10];
int num[10];
void cal(int x,int y){
    int a=0,b=0,c=0;
    for(int i=0;i<=x;i++){
        a=a*10+num[i];
    }
    for(int i=x+1;i<=y;i++){
        b=b*10+num[i];
    }
    for(int i=y+1;i<9;i++){
        c=c*10+num[i];
    }
    if((a*b-c)==n)
        ans++;
}
void solve(){
    for(int i=0;i<9;i++){
        for(int j=i+1;j<9;j++){
            cal(i,j);
        }
    }
}
int main(){
    cin>>n;
    for(int i=0;i<9;i++){
        num[i]=i+1;
    }
    int t=9*8*7*6*5*4*3*2*1-1;
    while(t--){
        next_permutation(num,num+9);
        solve();
    }
    cout<<ans<<endl;
return 0;
}



猜你喜欢

转载自blog.csdn.net/yimo_180227/article/details/80211200
今日推荐