问题描述
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;
}