历届试题 带分数
时间限制: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
值得一做的搜索 直接暴力搜索的话肯的超时的
很多题目都是暴力加上剪枝就能解决
按位数来解决 分子位数肯定大于分母 a位数再加一个b位数最多也就是他们大的进一位 一个a位数除以一个b位数得(a-b)位数或(a-b+1)
#include<stdio.h>
#include<string.h>
int vis[20];
int w,a,r,ks,total;
int pd(int x,int y)
{
if((x==w&&y<=w)||(y==w&&x<=w)||(x==w&&y==w))
return 1;
return 0;
}
int jw(int k) //计算多少位
{
int sum=0;
while(k)
{
sum++;
k/=10;
}
return sum;
}
int POW(int h)
{
int ans=1;
for(int i=1; i<h; i++)
ans*=10;
return ans;
}
int check(int m)
{
char str[10];
int kk=0;
memset(vis,0,sizeof(vis));
while(m)
{
str[kk++]=m%10+'0';
m/=10;
}
int flag=0;
for(int i=0; i<kk; i++)
if(str[i]>'9'||str[i]<'1')
return 0;
for(int i=0; i<kk-1; i++)
{
for(int j=i+1; j<kk; j++)
{
if(str[i]==str[j])
{
flag=1;
break;
}
}
if(flag)
break;
}
if(flag) return 0;
for(int i=0; i<kk; i++)
vis[str[i]-'0']=1;
return 1;
}
int checkk(int m)
{
char str[10];
int kk=0;
while(m)
{
str[kk++]=m%10+'0';
m/=10;
}
int flag=0;
for(int i=0; i<kk; i++)
if(str[i]>'9'||str[i]<'1')
return 0;
for(int i=0; i<kk-1; i++)
{
for(int j=i+1; j<kk; j++)
{
if(str[i]==str[j])
{
flag=1;
break;
}
}
if(flag)
break;
}
if(flag) return 0;
for(int i=0; i<kk; i++)
if(vis[str[i]-'0'])
return 0;
return 1;
}
void dfs(int cnt,int k)
{
if(k==a)
{
int ans=cnt*r;
int gg=jw(ans);
if(gg==9-a-ks)
if(checkk(ans))
{
total++;
// printf("%d %d %d\n",ans,cnt,r);
}
return ;
}
for(int i=1; i<10; i++)
if(!vis[i])
{
vis[i]=1;
dfs(cnt*10+i,k+1);
vis[i]=0;
}
}
int main()
{
int n,go,yo,i,j,k,b1,b2;
while(scanf("%d",&n)!=EOF)
{
w=jw(n);
total=0;
//printf("%d\n",w);
for(i=1; i<=w; i++)
{
ks=i;
for(j=1; j<=9-i-1; j++)
{
a=9-i-j;
if(a>j)
continue;
b1=j-a;
b2=j-a+1;
if(pd(b1,w)||pd(b2,w))//剪枝
{
go=POW(i);
yo=go*10;
for(k=go; k<yo; k++)
{
r=n-k;
if(r<1) continue;
//printf("%d %d %d\n",n,k,r);
if(check(k))
dfs(0,0);
}
}
}
}
printf("%d\n",total);
}
return 0;
}