历届试题 带分数
时间限制: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
思路:全排列之后的数组进行划分,划分为三部分,第一部分是整数部分t,其中由题意得t<n;第二部分是分子,由题意得分子大于分母且被分母整除。由以上可以进行一系列的剪枝。搜索过程中如果不是正解,则将分子的最后一位去掉,添加到分母部分的头部,分子少一位,分母多一位,再继续判断,如果是正解,那么ans++。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define inf 0x7f7f7f
using namespace std;
int n,ans;
int a[9]={1,2,3,4,5,6,7,8,9};
int main()
{
cin>>n;
do{
int k = 0;
int t = a[k];
while(t<n){
int fenzi = 0,fenmu = a[8];
for(int i = k+1;i < 8;i++)
fenzi=fenzi*10+a[i];
int xishu = 10;
while(fenzi>fenmu&&fenzi){
while(fenzi%fenmu!=0){
fenmu+=fenzi%10*xishu;
fenzi/=10;
xishu*=10;
}
if(fenzi>fenmu&&t+fenzi/fenmu==n)
ans++;
fenmu+=fenzi%10*xishu;
fenzi/=10;
xishu*=10;
}
t=t*10+a[++k];
}
}while(next_permutation(a,a+9));
cout<<ans<<endl;
return 0;
}