zoukankan      html  css  js  c++  java
  • 蓝桥杯 带分数

    100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
    还可以表示为:100 = 82 + 3546 / 197。
    注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
    类似这样的带分数,100 有 11 种表示法。

    从标准输入读入一个正整数N (N<1000*1000)

    程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

    注意:不要求输出每个表示,只统计有多少表示法!

    看到这个题,想着用vis标记是否出现。但是感觉后面的分数可以无限改变形式,就没思路了

    看了题解,感觉好厉害。

    首先 因为1~9出现且都仅出现一次,可以去全排列

    然后分为3部分,第一部分最多到7,第二部分最多到8,第三部分到最后

    然后就可以写了。复杂度不会分析,

    从 dfs(0,0)开始,表示从0位置,划分第1部分

    然后用双层for枚举

    其实就是这样的

    1 -2-3456789

    1-23-456789

    ……

    1-2345678-9

    12-3-456789

    ……

    1234567-8-9

    ……

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int a[9]={1,2,3,4,5,6,7,8,9};
     7 int ans,num[3],n;
     8 
     9 void dfs(int cur,int cnt) {
    10     if(cnt>1) {
    11         int sum=0;
    12         for(int i=cur;i<9;i++) sum=sum*10+a[i];
    13         num[cnt]=sum;
    14         if(num[1]%num[2]==0&&num[0]+num[1]/num[2]==n) ans++;
    15         return;
    16     }
    17     int dd=6+cnt;
    18     for(int i=cur;i<=dd;i++) {
    19         num[cnt]=0;
    20         int sum=0;
    21         for(int j=cur;j<=i;j++) {
    22             sum=sum*10+a[j];
    23         }
    24         num[cnt]=sum;
    25         dfs(i+1,cnt+1);
    26     }
    27 }
    28 
    29 int main() {
    30     while(~scanf("%d",&n)) {
    31         ans=0;
    32         sort(a,a+9);
    33         do{
    34             dfs(0,0);
    35         }while(next_permutation(a,a+9));
    36         printf("%d
    ",ans);
    37     }
    38 }
  • 相关阅读:
    【python】变量定义及全局局部变量
    【python】重要的内置函数
    【python】迭代器iterator
    Java序列化与反序列化
    java中的IO操作总结
    Java中List Set Map 是否有序等总结
    java.lang.Class.getDeclaredMethod()方法详解
    一个servlet处理多个请求(使用Method的反射机制)
    java类的访问权限
    java中的基本数据类型存放位置
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/10386238.html
Copyright © 2011-2022 走看看