求带分数(蓝桥杯)

问题描写叙述:带分数

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

思路:

求解的问题能够转化为n=i+j/k;--->j=(n-i)*k;用暴力求解就能求解出来。

由于共同拥有9位数字能够用,所以k最大能取到四位数字。i最大能取到n-1。

所以代码例如以下(考虑到一般的測试用不到时间測试函数,古关于时间的測量,那段函数,此处就省略了);

#include<stdio.h>
//#include<string.h>
int judge(int i,int j,int k)//用来推断是否三者中间存在同样的数字 
{
	int a[11]={0},g;
	while(i>0)
	{
		a[g=i%10]++;
		if(a[g]>1)//仅此一个 
		return 0;
		i/=10;
	}
	while(j>0)
	{
		a[g=j%10]++;
		if(a[g]>1)
		return 0;
		j/=10;
	}
	while(k>0)
	{
		a[g=k%10]++;
		if(a[g]>1)
		return 0;
		k/=10;
	}
	if(a[0]>0)//数字变化区间为1~9 
	return 0;
	for(i=1;i<=9;i++)
	{
		if(a[i]==0)
		return 0;
	}
	return 1;
}
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int i,j,k,count=0;
		for(i=1;i<=n-1;i++)//i最大为n-1 
		{
			for(k=1;k<=9999;k++)//k作为分母。变化区间有九位数字,k最多是四位数 
			{
				if(i!=k)
				{
					j=(n-i)*k;
					if(judge(i,j,k))
					count++;//count用来计数 
				}
			}
		}
		printf("%d\n",count);
	}
	return 0;
}



posted @ 2015-06-11 09:28  zfyouxi  阅读(182)  评论(0编辑  收藏  举报