历届试题 带分数
时间限制:1.0s 内存限制:256.0MB
问题描述
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
直接全排列
并在pos1,pos2 插入‘+’和 ‘/’ , 将数9个数分成 3份,
深搜 +点剪枝 ;
#include <stdio.h>
void rever(char str[],int len)
{
int i;
char tmp;
for(i=0;i<len/2;i++)
{
tmp=str[i];
str[i]=str[len-(i+1)];
str[len-(i+1)]=tmp;
}
}
char * perm(char str[],int len) //一个序列下一个全排列
{
int i,j,k;
char tmp;
for(i=len-2;i>=0;i--)
{
if(str[i]<str[i+1])
{
j=i;
break;
}
}
for(i=j+1;i<len;i++)
{
if(str[i]<str[j])
{
k=i-1;
break;
}
}
if(i==len) k=i-1;
tmp=str[j];
str[j]=str[k];
str[k]=tmp;
rever(&str[j+1],len-(j+1));
}
int nfun(int n) //求n!
{
int sum=1,i;
for(i=1;i<=n;i++)
{
sum*=i;
}
return sum;
}
int convert(char str[],int len) //将字符转换成整数
{
int data=0,i=1;
data+=str[0]-'0';
while(i!=len)
{
data=data*10+str[i]-'0';
i++;
}
return data;
}
int main()
{
char tmp,str[10]="123456789";
int i,j,k,t,n,num,pos1,pos2;
scanf("%d",&n);
//n=10000;
num=0;
int y=nfun(9)-1;
while(y--)
{
for(pos1=1;pos1<=5;pos1++)
{
t=convert(str,pos1);
if(t>=n)
{
break;
}
for(pos2=8;pos2>=pos1;pos2--)
{
j=convert(&str[pos1],pos2-pos1);
k=convert(&str[pos2],9-pos2);
if(j<k) break;
if(j%k!=0) continue;
else if(t+j/k==n)
{
num++;
// cout<<str<<" "<<pos1<<" "<<pos2<<endl;
}
}
}
perm(str,9);
}
printf("%d\n",num);
return 0;
}