问题描述
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
使用暴力遍历即可。以100为例。整数部分i从1遍历到98,分子从100-i开始,分母从1开始,同乘j,对j遍历即可。
#include<stdio.h>
#include<math.h>
int test(long long a,long long b,long long c,int bit1,int bit2,int bit3) //计算整数部分和分数部分是否满足要求。返回1代表不满足,返回0代表满足
{
long long total=0;
int temp=0,arr[10]={0},flag=0,i;
total=a*pow(10,bit2+bit3)+b*pow(10,bit3)+c;
for(i=0;i<bit1+bit2+bit3;i++)
{
temp=total%10;
arr[temp]++;
total/=10;
}
for(i=1;i<10;i++)
{
if(arr[0]!=0)
{
flag=1;
break;
}
if(arr[i]!=1)
{
flag=1;
break;
}
}
return flag;
}
int cal_bit(long long a)
{
int b=0;
while(a/10!=0)
{
a=a/10;
b++;
}
b++;
return b;
}
int main(void)
{
long long fenzi=0,fenmu=0,fenzi_bit=0,fenmu_bit=0,zhengshu_bit=0,n;
int i,j,num=0;
scanf("%I64d",&n);
for(i=1;i<n-1;i++)
{
for(j=1;;j++)
{
fenzi=n-i;
fenmu=1;
fenzi=fenzi*j;
fenmu=fenmu*j;
zhengshu_bit=cal_bit(i);
fenzi_bit=cal_bit(fenzi);
fenmu_bit=cal_bit(fenmu);
if(fenzi_bit+fenmu_bit>9)
{
break;
}
if( test(i,fenzi,fenmu,zhengshu_bit,fenzi_bit,fenmu_bit) ==0 )
{
num++;
}
}
}
printf("%d",num);
return 0;
}