标签:
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 const double EXP=1E-5; 8 const int MS=11; 9 int flag[MS],flag1[MS]; 10 int ans=0; 11 int len; 12 int a; 13 int init(int x) 14 { 15 memset(flag,0,sizeof(flag)); 16 flag[0]=1; 17 int ok=1; 18 int l=0; 19 while(x&&ok) 20 { 21 int r=x%10; 22 if(flag[r]) 23 return 0; 24 flag[r]=1; 25 x/=10; 26 l++; 27 } 28 return l; 29 } 30 int length(int x) 31 { 32 int l=0; 33 memcpy(flag1,flag,sizeof(flag)); 34 while(x) 35 { 36 int r=x%10; 37 if(flag1[r]) 38 return 0; 39 flag1[r]=1; 40 x/=10; 41 l++; 42 } 43 return l; 44 } 45 46 void dfs(int l,int x) 47 { 48 if(l<=len/2) 49 { 50 if(length(x*a)==len-l) 51 ans++; 52 for(int i=1;i<10;i++) 53 { 54 if(flag[i]) 55 continue; 56 flag[i]=1; 57 dfs(l+1,x*10+i); 58 flag[i]=0; 59 } 60 } 61 return ; 62 } 63 64 int main() 65 { 66 int n,i; 67 cin>>n; 68 for(i=1;i<n-1;i++) 69 { 70 len=init(i); 71 if(len) 72 { 73 len=9-len; 74 a=n-i; 75 dfs(0,0); 76 } 77 } 78 cout<<ans<<endl; 79 return 0; 80 }
标签:
原文地址:http://www.cnblogs.com/767355675hutaishi/p/4298450.html