历届试题 带分数
问题描述
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
解题思路:
N=A+B/C;
A,B,C位数相加为9,且每位数都不同。
考虑每个数的范围
A: 1-n;可以确定
但是B和C就不好确定
但是B C有关系
B=(N-A)*C;
C??不好确定
所以枚举A和C,A的范围已经知道啦,
我们只有A至少为一位
那么B+C最多为8为,又因为B要大于C,所以C最多为4,即1-9999
我的代码:
// #include<iostream> #include<math.h> #include<memory.h> #include<algorithm> using namespace std; int n; int check(int x,int y,int z) { int k=0,a[10]={0}; while(x) { a[x%10]++; if(a[x%10]>1) return 0; x=x/10; } while(y) { a[y%10]++; if(a[y%10]>1) return 0; y=y/10; } while(z) { a[z%10]++; if(a[z%10]>1) return 0; z=z/10; } if(a[0]!=0)//判断是否存在0 return 0; for(int i=1;i<=9;i++) { if(a[i]!=1) return 0; } return 1; } int main() { cin>>n; int x,y,z,i,j,sum=0; for(i=1;i<n;i++)//枚举整数 { for(j=1;j<=9999;j++)//枚举分母 因为分子+分母<=8且分子>分母 所以分母最多四位 { if(i!=j&&(n-i)*j>=j) { if(check(i,j,(n-i)*j)==1) { sum++; } } } } cout<<sum<<endl; }