蓝桥杯第4届第9题

标题:带分数

    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

#include<stdio.h>
int a[]={1,2,3,4,5,6,7,8,9},n,num=0,sun=0,z1=0,z2=0,z3=0;
int toInt(int i,int j)//转为整数 
{
	int sum=0,k;
	for(k=0;i+k<j;k++)
	sum=sum*10+a[i+k];
	return sum;
}
void exchange(int i,int j)//交换 
{
	int temp;
	temp=a[i];
	a[i]=a[j];
	a[j]=temp;
}
void allArray(int length)//全排列 
{
	int i=0,j,k,q,m=0;
	if(length==8)
	{//对任意一种排列进行判断 
    	for(j=1;toInt(0,j)<n;j++)
		{
			z1=toInt(0,j);
			for(k=j;k<9;k++)
			{
					if(k-j>=9-k)
		    	    {
			        	z2=toInt(j,k);
			        	z3=toInt(k,9);
			        	if((z1*z3+z2)==(z3*n))//可以用(z2%z3==0&&z1+z2/z3==n) 
			         	{
			         		num++;
						}
			        }
			}
		}
	}
	else
	{
		while(length+i<9)//全排列的递归算法 
		{
			exchange(length,length+i);
			allArray(length+1);
			exchange(length,length+i);
			i++;
		}
	}
}
int main()
{
	scanf("%d",&n);
	allArray(0);
	printf("%d\n",num);
}


你可能感兴趣的:(蓝桥杯第4届第9题)