ZCMU-1842-带分数
2017-01-21 14:19
218 查看
1842: 带分数
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 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
100105
Sample Output
116
【解析】
这道题其实刚开始想的时候真的没什么思路..不过好像可以进行全排列的来,这个形式就是整数+分数,而分数是可以
整除的,所以我们在全排列的时候安排前面的整数最大是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; }
相关文章推荐
- ZCMU-1163-分数划分
- 高考学子烧香 分数阿弥陀佛
- ZCMU1158: 松哥的二叉树
- Javascript的代码,具体要求为将任意小数转化为分数的形式
- 创建一个分数类,实现分数的加减乘除
- 浙江大学:录取时以考试分数为准
- D. Fafa and Ancient Alphabet【求概率+分数取模】
- 练手_分数加减乘除
- 分数化小数
- 绕过99SuShe的ActiveX控件查四六级分数之方法
- zcmu1038
- 使用LinkedHashMap进行分数排序
- 迭代加深搜索求埃及分数
- 数据结构 运动会分数统计
- 分数的加减法
- [PKU 2976]Dropping tests(分数规划)
- POJ - 3111 K Best 0-1分数规划 二分
- SQL语句面试题求解——学生分数问题
- 九数组分数
- 学习小学五年级的知识——怎么将分数化为小数