题解 | #Sum of Factorials# 两种方法

Sum of Factorials

https://www.nowcoder.com/practice/42cb1c7f7344466b8cb1710cb12d06b1

  • 分别使用暴力方法、dfs搜索可能的阶乘之和

#include <iostream>
using namespace std;
// 0~9的阶乘之和为 409,114,而 0~10阶乘之和为 4,037,914
void getFac(int *fac){ // 首先计算 0~9 阶乘
    fac[0]=1;
    for(int i=1;i<10;i++){
        fac[i]=fac[i-1]*i;
    }
}
// 1、暴力搜索 从大到小
bool check(int n,int *fac){ 
    for(int i=9;i>=0;i--){
        if(fac[i]<=n){ // 注意等号
            n-=fac[i];
        }
        if(n==0) return true;
    }
    return false;
}
// 2、使用 dfs 进行搜索 
bool checkInDFS(int n, int sum, int i, int *fac){
    // n为待判断的数, sum为当前已选过的阶乘之和, i为遍历深度
    // 从 0!到 9!,每层阶乘都有选和不选两种状态
    if(i==9){
        if(sum==n) return true;
        else return false;
    }
    // 若无法找到一种解,则本层结点选和不选的返回值都为 false
    if(checkInDFS(n, sum+fac[i], i+1, fac)||checkInDFS(n, sum, i+1, fac)) return true;
    else return false;
}

int main() {
    int fac[10];
    getFac(fac);
    int n;
    while(cin>>n){
        bool ans;
        ans=check(n,fac);
        // ans=checkInDFS(n,0,0,fac);
        if(ans) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
全部评论

相关推荐

06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
程序员牛肉:公平那是对小孩子讲的童话故事,成年人的世界只有能不能接受失败的后果。 你要是能接受面试作弊被发现之后多家公司联合永久拉黑的后果,你就搞。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务