題目描述
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;
}