• zoj 2358,poj 1775 Sum of Factorials(数学题)


    题目poj

    题目zoj

    //我感觉是题目表述不确切,比如他没规定xi能不能重复,比如都用1,那么除了0,都是YES了
    //算了,这种题目,百度来的过程,多看看记住就好
    //题目意思:判断一个非负整数n能否表示成几个数的阶乘之和
    //这里有一个重要结论:n!>(0!+1!+……+(n-1)!),
    //证明很容易,当i<=n-1时,i!<=(n-1)!,故(0!+1!+……+(n-1)!)<=n*(n-1)!=n!.
    //     由于题目规定n<=1000000,而10!=3628800>100000,故只需保存前10项的阶乘.
    //       有两个需要注意的地方:1>如果题目输入0,按照上面的方法处理得到的结果是"YES",
    //而按照题目的意思应该输出"NO",所以需要特别处理.
    //              2>题目输入结束的方法是以如果输入的数为负数就结束输入.
    
    //10! = 3628800 > 1000000
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
        int n,i;
        int fact[11];//这里还是要开的大一点。。因为下标从0开始
        fact[0]=1;
        for(i=1;i<=10;i++)
            fact[i]=fact[i-1]*i;
        
        while(scanf("%d",&n)!=EOF)
        {
            if(n<0) break;
            if(n==0)
                printf("NO
    ");
            else {
                    for(i=10;i>=0;i--) //之前错了,是这样的:0!=1 ,也算进去的
                    {
                        if(n-fact[i]>=0)
                            n-=fact[i];
                    }
                if(n==0)
                    printf("YES
    ");
                else
                    printf("NO
    ");
            }
        }
        return 0;
    }
    View Code
    一道又一道,好高兴!
  • 相关阅读:
    wayland学习笔记(八) wayland为什么要用libffi
    线程安全函数和可重入函数 辨析
    patch的基本使用
    c++ condition_variable的wait 语法糖
    系统启动知识 说道说道(一) 冰山之下
    DDR 带宽计算公式
    wayland学习笔记(七)config的结构分析
    功耗管理篇
    operator=() 重载的问题
    ABC216
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3817839.html
Copyright © 2020-2023  润新知