zoukankan      html  css  js  c++  java
  • 蓝桥杯 分解单位数

    形如:1/a 的分数称为单位分数。

    可以把1分解为若干个互不相同的单位分数之和。
    例如:
    1 = 1/2 + 1/3 + 1/9 + 1/18
    1 = 1/2 + 1/3 + 1/10 + 1/15
    1 = 1/3 + 1/5 + 1/7 + 1/9 + 1/11 + 1/15 + 1/35 + 1/45 + 1/231
    等等,类似这样的分解无穷无尽。

    我们增加一个约束条件:最大的分母必须不超过30

    请你求出分解为n项时的所有不同分解法。

    数据格式要求:

    输入一个整数n,表示要分解为n项(n<12)

    /*
    *设置一个模型,将 a[n]=i 存入的 n对应要接收数字的位置,i表示目前要存放的数字
    *暴力枚举,深度搜索,检索出所有的排列可能性
    *为了避免发生全排列的重复,存入的数字保证比上一个数字大 1(s=cur?a[cur-1]+1:1)
    *注意浮点类型,int *1.0 否则出错 
    */
    #include<stdio.h>
    #include<string.h>
    int n;
    int a[30];
    void dfs(int cur){
    //检查是否放置了n个数字 
    if(cur==n){
    //初始化和为0.0 
    float sum=0.0;
    //从第0个位置开始累加,判断是否符合要求 
    for(int i1=0;i1<n;i1++){
    sum+=1.0/(a[i1]*1.0);
    }
    if(sum<1.000001 && sum>0.99999)
    {
    for(int i1=0;i1<n;i1++)
    printf("1/%d ",a[i1]);
    printf("
    ");
    }
    //返回到上一层,不用继续向下搜索 
    return;
    }
    //保证当前开始的数字比上一个数字小于一 
    int s=cur?a[cur-1]+1:1;
    //从比上一个数字大于1的数字到30进行搜索 
    for(int i2=s;i2<=30;i2++){
    int ok=1;
    for(int j=0;j<cur;j++)
    if(a[j]==i2) //如果数字发生重复说明之前放置过该数字 
    ok=0;
    if(ok){
    a[cur]=i2;
    dfs(cur+1);    //进行下一步搜索 
    }
    }
    return;
    }
    int main(){
    while(scanf("%d",&n)==1){
    memset(a,1,sizeof(a));
    dfs(0);
    }
    return 0;
    }
  • 相关阅读:
    激活函数(ReLU, Swish, Maxout)
    损失函数
    md5sum命令行使用注意事项
    Jetson ARM SeetaFace编译
    Linux下的wine生活(QQ/微信/Office)
    人脸识别引擎SeetaFace编译 ubuntu
    Python为8bit深度图像应用color map
    MySQL、MongoDB、Redis数据库Docker镜像制作
    bash的管道符与重定向
    Docker 及 nvidia-docker 使用
  • 原文地址:https://www.cnblogs.com/sky-z/p/4409893.html
Copyright © 2011-2022 走看看