您的位置:首页 > 其它

ZCMU-1842-带分数

2017-01-21 14:19 218 查看

1842: 带分数

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 8  Solved: 2

[Submit][Status][Web
Board]

Description

100  可以表示为带分数的形式:100  =  3  +  69258  /  714。 还可以表示为:100  =  82  +  3546  /  197。 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100有 11  种表示法。

Input

  从标准输入读入一个正整数N (N< 1000*1000)

Output

 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。 注意:不要求输出每个表示,只统计有多少表示法!

Sample Input

100

105

Sample Output

11

6

【解析】
这道题其实刚开始想的时候真的没什么思路..不过好像可以进行全排列的来,这个形式就是整数+分数,而分数是可以
整除的,所以我们在全排列的时候安排前面的整数最大是7位数,因为后面最少最少也需要1位除1位,而被除数最少肯
定也需要一位。所以j的范围是的7,i的范围是到1.这样我们做个预处理之后直接查询就可以了。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int b[1000100];
int main()
{
int a[9]={1,2,3,4,5,6,7,8,9};
int i,j,k,n,m,p,sum;
do//每次排列都做一次
{
for(i=0;i<=6;i++)//表示i最大可以到7位
{
for(j=i+1;j<=7;j++)//j最大是7-i-1
{
n=0;
m=0;
p=0;
for(k=0;k<=i;k++)
{
n=n*10+a[k];
}
for(k=i+1;k<=j;k++)
{
m=m*10+a[k];
}
for(k=j+1;k<=8;k++)
{
p=p*10+a[k];
}
if(m%p==0)//表示如果后面的分数可以整除
{
sum=n+m/p;
if(sum<1000000)//因为数据范围就是在1000*1000当中
b[sum]++;
}
}
}
} while(next_permutation(a,a+9));
scanf("%d",&n);
printf("%d\n",b
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: