题目描述
100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
AC代码:
/*
1.n = a + b/c;
2.全排列9个数字
3.分段,割成三段,分别对应a, b, c
4.判断
*/
#include <cstdio>
#include <iostream>
using namespace std;
int count = 0;//记录多少中表示方法
int nums[9];//存储全排列
int N,a,b,c;
int used[9];//代表这个数字是否使用
int cal(int left, int right)
{
int num = nums[left];
while(left < right)
{
num = num * 10 + nums[++left];
}
return num;
}
void dfs(int index)//枚举到第index位置
{
if(index == 9)
{
//枚举到第9个位置,说明枚举完成,分割
//1 2 3 4 5 6 7 8 9
//分割,i代表第一道分割线,最多包含7,即第六个位置
//分割,j代表第二道分割线 ,最多包含8,即第七个位置
for(int i = 0; i < 7; i++)
{
for(int j = i + 1; j < 8; j++)
{
a = cal(0,i);
b = cal(i+1,j);
c = cal(j+1,8);
//判断是否满足
//先判断b能否整除c
//在判断相加结果
if(N*c == a*c + b)
count++;
}
}
return;
}
for(int i = 1; i <= 9; i++)
{
if(!used[i])
{
used[i] = 1;
nums[index] = i;
dfs(index + 1);
used[i] = 0;;
}
}
}
int main()
{
scanf("%d", &N);
dfs(0);
printf("%d", count);
return 0;
}