• [蓝桥杯][历届试题]带分数


    时间限制: 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;
    }
  • 相关阅读:
    关于论文绘图的一些拾遗
    在线word论文生成的方法
    用LyX写中文幻灯片
    关于KO信息
    关于中文期刊LaTeX的CCT相关
    Android NDK and OpenCV Development With Android Studio
    android上的JAVA8:使用retrolambda
    WebSocket学习笔记——无痛入门
    html5利用websocket完成的推送功能
    [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8728183.html
Copyright © 2020-2023  润新知