100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N(N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
例如:
用户输入:
100
程序输出:
11
再例如:
用户输入:
105
程序输出:
6
资源约定:
峰值内存消耗 <64M
CPU消耗 < 3000ms
排列,牛逼函数:next_permutation()
使用举例:
#include<iostream> #include<algorithm> using namespace std; int main() { int a[4]= {1,2,3,4}; while(next_permutation(a,a+4)) { cout<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl; } }
代码:
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int f(int star,int end,int a[]) { if(star>end) return 1; int n=0; for(int i=star; i<=end; i++) { n=n*10+a[i]; } return n; } int main() { int n; int count=0; cin>>n; int size=0; int x=n; while(n) { size++; n=n/10; } int a[9]= {1,2,3,4,5,6,7,8,9}; while(next_permutation(a,a+9)) //牛逼的全排函数。 { for(int i=0; i<=size; i++) { for(int j=8-(8-i)/2; j<8; j++) { int x1=f(0,i,a); int x2=f(i+1,j,a); int x3=f(j+1,8,a); if(x==x1+x2/x3&&x2==x3*(x2/x3)) { count++; cout<<x1<<"+"<<x2<<"/"<<x3<<endl; } } } } printf("%d\n",count); return 0; }