历届试题 带分数-(全排列)
Posted shoulinniao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了历届试题 带分数-(全排列)相关的知识,希望对你有一定的参考价值。
问题描述
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
解题过程:
全排列暴搜
1.n = x + b/c
2.x<n
3.b%c=0
4.b>c b的长度大于等于c
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<vector> 5 #include<stack> 6 #include<set> 7 #include<queue> 8 #include<cstring> 9 #define ll long long 10 using namespace std; 11 12 int a[9]; 13 14 int main() 15 { 16 for(int i=0;i<9;i++) 17 a[i]=i+1;///数字1-9 18 int n,x,b,c,ans=0; 19 scanf("%d",&n); 20 do 21 { 22 x=0; 23 for(int i=0;i<6;i++)/// n<= 1000000 24 { 25 x=x*10+a[i]; 26 if(x<n) 27 { 28 int idx=(8-i)/2;///对x后面的数位折半 确保b>c 29 while((i+idx)<8) 30 { 31 b=0;c=0; 32 int j; 33 for(j=i+1;j<=(i+idx);j++) 34 b=b*10+a[j]; 35 for(;j<9;j++) 36 c=c*10+a[j]; 37 if(b%c==0 && b>c && n==(x+b/c) ) 38 ans++; 39 idx++; 40 } 41 } 42 } 43 }while(next_permutation(a,a+9));///对数组a里下标为0到下标为8这九个数全排列 44 printf("%d ",ans); 45 return 0; 46 }
以上是关于历届试题 带分数-(全排列)的主要内容,如果未能解决你的问题,请参考以下文章