蓝桥杯 带分数
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
看到这个题,想着用vis标记是否出现。但是感觉后面的分数可以无限改变形式,就没思路了
看了题解,感觉好厉害。
首先 因为1~9出现且都仅出现一次,可以去全排列
然后分为3部分,第一部分最多到7,第二部分最多到8,第三部分到最后
然后就可以写了。复杂度不会分析,
从 dfs(0,0)开始,表示从0位置,划分第1部分
然后用双层for枚举
其实就是这样的
1 -2-3456789
1-23-456789
……
1-2345678-9
12-3-456789
……
1234567-8-9
……
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 6 int a[9]={1,2,3,4,5,6,7,8,9}; 7 int ans,num[3],n; 8 9 void dfs(int cur,int cnt) { 10 if(cnt>1) { 11 int sum=0; 12 for(int i=cur;i<9;i++) sum=sum*10+a[i]; 13 num[cnt]=sum; 14 if(num[1]%num[2]==0&&num[0]+num[1]/num[2]==n) ans++; 15 return; 16 } 17 int dd=6+cnt; 18 for(int i=cur;i<=dd;i++) { 19 num[cnt]=0; 20 int sum=0; 21 for(int j=cur;j<=i;j++) { 22 sum=sum*10+a[j]; 23 } 24 num[cnt]=sum; 25 dfs(i+1,cnt+1); 26 } 27 } 28 29 int main() { 30 while(~scanf("%d",&n)) { 31 ans=0; 32 sort(a,a+9); 33 do{ 34 dfs(0,0); 35 }while(next_permutation(a,a+9)); 36 printf("%d\n",ans); 37 } 38 }
埋骨何须桑梓地,人生无处不青山