历届试题 带分数

问题描述

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

解题思路:

N=A+B/C;

A,B,C位数相加为9,且每位数都不同。

考虑每个数的范围

A: 1-n;可以确定

但是B和C就不好确定

但是B C有关系

B=(N-A)*C;

C??不好确定

所以枚举A和C,A的范围已经知道啦,

我们只有A至少为一位

那么B+C最多为8为,又因为B要大于C,所以C最多为4,即1-9999

我的代码:

// 
#include<iostream>
#include<math.h>
#include<memory.h>
#include<algorithm>
using namespace std;
int n;
int check(int x,int y,int z)
{
	int k=0,a[10]={0};
	while(x)
	{
		a[x%10]++;
		if(a[x%10]>1)
			return 0;
		 x=x/10;
	}
	while(y)
	{
		a[y%10]++;
		if(a[y%10]>1)
			return 0;
		 y=y/10;
	}
	while(z)
	{
		a[z%10]++; 
		if(a[z%10]>1)
			return 0;
		z=z/10;
	}
	if(a[0]!=0)//判断是否存在0 
		return 0;
	for(int i=1;i<=9;i++)
	{
		if(a[i]!=1)
			return 0;
	}
	return 1;
}
int main()
{
	cin>>n;
	int x,y,z,i,j,sum=0;
	for(i=1;i<n;i++)//枚举整数 
	{
		for(j=1;j<=9999;j++)//枚举分母 因为分子+分母<=8且分子>分母 所以分母最多四位 
		{   
			if(i!=j&&(n-i)*j>=j)
			{
				if(check(i,j,(n-i)*j)==1)
				{
					sum++;
				}
			}
		}		
   }
  cout<<sum<<endl;
} 


posted @ 2017-04-06 20:55  X_na  阅读(236)  评论(0编辑  收藏  举报