问题描述
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
#include <stdio.h> int w=0,n,count=0; int list[]={1,2,3,4,5,6,7,8,9}; int main() { void perm(int a[],int n,int k=-1); inline void Swap(int &a,int &b); int GetNum(int list[],int i,int j); scanf("%d",&n); int temp=n; while(temp!=0) { temp=temp/10; w++; } perm(list,9); printf("%d ",count); return 0; } int GetNum(int list[],int i,int j) { //将list[i]到list[j]之间转换为数字 int k,num=0; for(k=i;k<=j;k++) { num=num*10+list[k]; } return num; } void perm(int a[],int size,int k=-1) { int i; if(k==-1) k=size-1; if(k==0) { //排列结束。 int j,u;//j表示a的末尾位数 不能超过num的位数;u表示bLast所在的位置 int a=0,b=0,c=0,bLast=0; for(j=0;j<w;j++) { a=GetNum(list,0,j); /*num=a+b/c 变形可以得到 b=(num-a)*c 而cLast=list[8] 可以得到的是 bLast=((num-a)*list[8])%10; */ bLast=((n-a)*list[8])%10; for(u=j+1;u<8;u++) { if(list[u]==bLast) { b=GetNum(list,j+1,u); c=GetNum(list,u+1,8); if(a+b/c==n&&b%c==0) count++; } } } } else { for(i=0;i<=k;i++) { int tmp; tmp=a[i]; a[i]=a[k]; a[k]=tmp; perm(a,size,k-1); tmp=a[i]; a[i]=a[k]; a[k]=tmp; } } }