100100 可以表示为带分数的形式:100=3+69258714100=3+69258714
还可以表示为:100=82+3546197100=82+3546197
注意特征:带分数中,数字 1∼91∼9 分别出现且只出现一次(不包含 00)。
类似这样的带分数,100100 有 1111 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼91∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<1061≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
先贴题解
#include<stdio.h>
int n,ans,o,p,q;
int a[9],state[10];//数组a表示9个数的全排列,state[i]表示数字i是否在a内
int ca(int x,int y)/*这是一个用于计算的函数,把a[x]到a[y]的数字用整型表示出来,最终返回值是计算结果*/
{
int num=0;
for(int i=x;i<=y;i++)
{
num=num*10+a[i];
}
return num;
}
int check(int x,int y,int z)//用于判断是否符合题意的函数
{
if(y%z==0&&x+y/z==n)
return 1;
else
return 0;
}
void dfs(int x)//x代表已经放了几个数字进去
{
if(x==9)
{
for(int i=0;i<7;i++)//第一段数字
{
for(int j=i+1;j<8;j++)//第二段数字
{
o=ca(0,i);//第一段数字的值
p=ca(i+1,j);//第二段数字的值
q=ca(j+1,8);//第三段数字的值
if(check(o,p,q)) ans++;//符合题意,结果+1
}
}
return;//这个还是得写一下
}
for(int i=1;i<=9;i++)//1~9的9个数字
{
if(state[i]==0)
{
state[i]=1;
a[x]=i;
dfs(x+1);
state[i]=0;
a[x]=0;
}
}
}
int main()
{
scanf("%d",&n);
dfs(0);
printf("%d",ans);
return 0;
}
这种题一般第一眼都毫无思路,看题解都要看好几遍,不过多看几遍之后就大概了解什么意思了。
这道题的大概解法是枚举1~9的所有排列,然后分成三段,分别作为整数分母和分子然后挨个验证一下,符合的话结果就+1。
前边一开始是理解的,只不过递归的全排列又懵了一下,还是for循环里加递归函数的情况,函数出口下面恢复现场就可以了,这点又忘记了