思路? 暴力匹配?
讀入目標數 n
看n是否與a+b/c相等
因為c++里面的除法是整除
我們將 n==a+b/c
轉換為 c*n==a*c+b
那么如何獲得a,b,c
依題意 a,b,c三個數由1-9九個數字組成
且每個數字只能出現一次
由此 我們可以搜出123456789的全部排列方式?
然后 每次將這個九位數分成三部分
例如 a=12,b=4567,c=89
又假如 當前排列為 985476321
獲得a=985,b=476,c=321;
或者
a=98,b=5476,c=321;
枚舉出所有的分法
同時與目標值匹配即可
若相等 則計數++
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring >
using namespace std;
int n,cnt;
const int N=10;
bool used[N];
int st[N];
int num[10]={1,2,3,4,5,6,7,8,9};
int cal(int i,int j);
void dfss()
?? ?{
?? ??? ?//雙循環 枚舉出所有的分法?
?? ??? ??? ?for(int i=1;i<=6;i++){
?? ??? ??? ??? ?for(int j=i+1;j<=8;j++){
?? ??? ??? ??? ??? ?int a=cal(1,i);
?? ??? ??? ??? ??? ?int b=cal(i+1,j);
?? ??? ??? ??? ??? ?int c=cal(j+1,9);
?? ??? ??? ??? ??? ?//cout<<a<<endl<<b<<endl<<c<<endl;
?? ??? ??? ??? ??? ?if(c*n==a*c+b){
?? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ?cnt++;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?
?? ??? ?//cout<<dsf(1);
?? ?}
void dfs(int u){
?? ?if(u>9){
?? ??? ?//當u>9說明已經搜索出了一個排列
?? ??? ?//修改num內存的值與當前排列相同?
?? ??? ?int ans=0;
?? ??? ?for(int i=1;i<=9;i++){
?? ??? ??? ?num[i]=st[i] ;
?? ??? ??? ?
?? ??? ?//?? ?cout<<num[i]<<' ';
?? ??? ?}
?? ?
?? ??? ?dfss();//計算當前排列是否匹配目標值?
?? ??? ?return ;
?? ?}
?? ?for(int i=1;i<=9;i++){
?? ??? ?if(!used[i]){
?? ??? ??? ?used[i]=true;
?? ??? ??? ?st[u]=i;
?? ??? ??? ?dfs(u+1);
?? ??? ??? ?used[i]=false;
?? ??? ??? ?st[u]=0;
?? ??? ?}
?? ??? ?
?? ?}
?? ?
?? ?
}?
int cal(int i,int j){
?? ?
?? ?int res=0;
?? ?for( ;?? ?i<=j;i++){
?? ??? ?res=res*10+num[i];
?? ?}
?? ?//將num的值轉化為a,b,c的值?
?? ?return res;
}
int main(){
?? ?cin>>n;
?? ?dfs(1);
?? ?cout<<cnt;
?? ?
?? ?return 0;
}?