zoukankan      html  css  js  c++  java
  • [蓝桥杯][历届试题]带分数

    时间限制: 1Sec 内存限制: 128MB 提交: 46 解决: 31

    题目描述
    100  可以表示为带分数的形式:100  =  3  +  69258  /  714。 
    还可以表示为:100  =  82  +  3546  /  197。 
    注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 
    类似这样的带分数,100  有  11  种表示法。 
    输入
    从标准输入读入一个正整数N  (N< 1000*1000) 
    输出
    程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。 
    注意:不要求输出每个表示,只统计有多少表示法! 
    样例输入
    100  
    样例输出
    11

    /*

     首先是进行全排列,然后根据全排列的结果枚举x,y,z

        x的长度为1-7

        y的最短长短是:(9-x的长度)/2 ,最长的长度:8-x的长度
        z的长度是剩下的长度,至少为一个长度。

      */

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int vis[10];
    int a[10],ans,n;
    long long  num(int s,int e){
        long long sum = 0;
        for(int i=s;i<=e;i++) sum = sum*10+a[i];
        return sum;
    } 
    void dfs(int cur)
    {
        if(cur == 10)
        {
            //for(int i=1;i<=9;i++) printf("%d",a[i]);
            //printf("
    ");
            for(int i=1;i<=7;i++)
            {
                long long x = num(1,i);
                int len = (9-i)/2; //y的最短长度 
                for(int j=len;j<=8-i;j++)
                {
                    long long y=num(i+1,i+j); 
                    long long z=num(i+j+1,9);
                    //printf("%d = %d + %d/%d
    ",n,x,y,z);
                    if(y%z == 0 && x+y/z==n) ans++;
                } 
            } 
            return ;
        }
        for(int i=1;i<=9;i++)
        if(!vis[i])
        {
            vis[i]=1;
            a[cur]=i;
            dfs(cur+1); 
            vis[i]=0;
        }
    }
    int main(void)
    {
        scanf("%d",&n);
        dfs(1);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    阿里云esc 安装 mysql8.0
    阿里云esc 登录时的相关提示
    C# web项目 log4net 使用
    MVC 全局异常捕获
    datetimepicker 基础使用/select2 基础使用
    C# 从登陆开始 MVC4+BOOTSTRAP
    Android如何导入语言资源
    Android自带邮件含中文的附件用HTML打开乱码问题的解决
    android 解决输入法遮挡输入框的问题
    repo代码简单解读
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8728183.html
Copyright © 2011-2022 走看看