• 求带分数(蓝桥杯)


    问题描写叙述:带分数

    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
    ",count);
    	}
    	return 0;
    }



  • 相关阅读:
    DockerFile 解析
    Docker 容器数据卷
    Docker 镜像
    Docker 常用命令
    Docker 安装
    vue全站式笔记
    接口环境配置
    前端跨域的三种方式
    vue+axios 模拟后台返回数据的三种方式:本地创建json、easymock平台、mockjs
    cookie、sessionStorage与localStorage是什么?
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4568086.html
Copyright © 2020-2023  润新知