判断n是否为阶乘之和

http://acm.nyist.net/JudgeOnline/problem.php?pid=91
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

思路:假设a(a+2)* *(b)+ (a+1)(a+2)* *(b)*(b+1)** *(c));
则n可以整除a!。可以看出,如果n是阶乘之和,则从i=1开始递增,如果n可以整除i,则n不断除以i,直到遇到n不能整除i,则(n-1)一定可以整除i。

 
#include
#include
using namespace std;
int main()
{
        int t;
        scanf("%d",&t);
        while(t--)
        {
           int num;
           scanf("%d",&num);
           int i=1;
           bool flag=true;
           while(num>1)
           {

               if(((num/i)*i)==num){
                num/=i;
               }
               else
               {
                    num--;
                    if(((num/i)*i)==num)
                    {
                         num/=i;
                    }
                    else{
                        flag=false;
                        break;
                    }
               }
                i++;
           }
           if(flag) printf("Yes\n");
           else printf("No\n");
        }

}

你可能感兴趣的:(判断n是否为阶乘之和)