题解

1 条题解

  • 1
    @ 2022-08-14 17:11:11

    贝蒂的数学

    暴搜即可。

    #include <cstdio>
    #include <iostream>
    using namespace std;
    bool vis[15];
    int n,ans,a[105];
    void dfs(int pos)//
    {
        if(pos==10)//如果 9 个数字都用完了,就可以去分类了 
        {
            int left=0;//整数部分 
            for(int i=1; i<=7; i++)
            {
                left=left*10+a[i];//每次加上 
                if(left>=n)//一旦整数就抄了,不做了,此解法不对 
                    break;
                int up=0;//分子 
                for(int j=i+1; j<=8; j++)
                {
                    up=up*10+a[j];//每次加上 
                    int down=0;//分母 
                    for(int k=j+1; k<=9; k++)
                    {
                        down=down*10+a[k];//最后的数字给分母 
                    }
                    if(up%down==0&&left+up/down==n)//一旦能整除且他们如题目的要求加起来是 n 
                        ans++;//那么 ans++ 
                }
            }
            return;
        }
        for(int i=1; i<=9; i++)//暴力枚举 1~9 的排列,枚举完后再分类(整数,分子,分母),即上面的操作 
        {
            if(!vis[i])//只要没用过 
            {
                vis[i]=1;//先标记用过了 
                a[pos]=i;//a 数组存目前排列的方法 
                dfs(pos+1);//继续搜 
                vis[i]=0;//回溯 
            }
        }
    }
    int main()
    {
        cin>>n;
        dfs(1);//开始从 1 搜索 
        cout<<ans<<endl;
        return 0;
    }
    
  • 1

信息

ID
1462
难度
6
分类
搜索 点击显示
标签
递交数
2
已通过
1
通过率
50%
上传者