码迷,mamicode.com
首页 > 其他好文 > 详细

带分数的求法(蓝桥杯)

时间:2014-09-18 00:49:43      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:蓝桥杯

问题描述:带分数

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;
}



带分数的求法(蓝桥杯)

标签:蓝桥杯

原文地址:http://blog.csdn.net/ice_alone/article/details/39354879

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!