带分数
问题描述
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
思路:暴力求解,全排列,注意剪枝,以免超时
全排列:递归,从剩余的数中选一个存入数组
#include <stdio.h>
#include <math.h>
int a[9];
int flag[10];
int counts=0;
void qpl(int s,int m,int n)
{
int z;
int c1,c2,c3;
int i,j,k,r,q;
if(s>=9)
{
for(i=0;i<m;i++)
{
c1=0;
for(j=0;j<=i;j++)
{
c1=c1+a[j]*(int)(pow(10,i-j)+0.5);
}
for(q=1;q<=(9-i-1)/2;q++)
{
if((int)(pow(10,9-i-1-q*2-1)+0.5)<=n-c1)
{
c2=0;
c3=0;
for(k=i+1;k<9-q;k++)
{
c2=c2+a[k]*(int)(pow(10,9-q-k-1)+0.5);
}
for(r=9-q;r<9;r++)
{
c3=c3+a[r]*(int)(pow(10,9-r-1)+0.5);
}
if(c2%c3==0&&c1+c2/c3==n)
counts++;
}
}
}
}
else
{
for(z=1;z<=9;z++)
{
if(flag[z]==0)
{
a[s]=z;
flag[z]=1;
qpl(s+1,m,n);
flag[z]=0;
}
}
}
}
int main()
{
int m,n,i;
scanf("%d",&n);
i=5;
while(1)
{
int b=(int)(pow(10,i)+0.5);
if(n/b!=0)
{
m=i;
break;
}
i--;
}
m++;
qpl(0,m,n);
printf("%d",counts);
return 0;
}