蓝桥 带分数
问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
解题思路:全排列,剪枝
#include<bits/stdc++.h> using namespace std; #define Max 200050 int a[10],flag[10]; int ans; int m,m1,m2,m3; int sum(int start,int endd){ int sum=0; for(int i=start;i<=endd;i++){ sum=sum*10+a[i]; } return sum; } void cheak(int a[]){ for(int i=1;i<10;i++){ m1=sum(1,i); if(m1>m) break; for(int j=(10-i)/2+i;j<9;j++){ m2=sum(i+1,j); m3=sum(j+1,9); if(m2%m3==0&&m==m1+m2/m3) ans++; } } } void DFS(int start,int endd){ if(start==endd){ cheak(a); } else{ for(int i=1;i<=9;i++){ if(flag[i]){ continue; } else{ a[start]=i; flag[i]=1; DFS(start+1,endd); flag[i]=0; } } } } int main(){ cin>>m; DFS(1,10); cout<<ans<<endl; return 0; }
浙公网安备 33010602011771号