蓝桥杯 带分数

 历届试题 带分数  
时间限制: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
       一个搜索题,想了想用全排列做,学会使用next_permutation库函数,可以帮助你进行全排列,next_permutation函数返回值是布尔类型,当进行完最后一个全排列后返回NULL。
       思路:全排列之后的数组进行划分,划分为三部分,第一部分是整数部分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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值