【贪心】nyoj91

来源:互联网 发布:java特种兵 编辑:程序博客网 时间:2024/05/14 19:00

这道题目的思路是借鉴别人的。

思路:找到值小于n的且值为最大的那个数的阶乘;

阶乘之和

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

输入
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
如果符合条件,输出Yes,否则输出No;
样例输入
2
9
10
样例输出
Yes
No
代码:


#include<iostream>#include<stdio.h>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>using namespace std;int JC[11]= {0, 1, 2, 6 ,24, 120, 720 ,5040 ,40320 ,362880 ,3628800};int main(){    int m,i;    scanf("%d",&m);    while(m--)    {        int n,sum=0,flag=0,j=10;        scanf("%d",&n);        int n1=n;        for(i=j;i>=1;i--)        {            if(JC[i]<=n1)            {                sum+=JC[i];             //计算sum的值与n比较;                n1-=JC[i];//                printf("%d ",JC[i]);                j=i-1;            }            if(sum==n)               flag=1;            if(sum>=n||j==0)            //跳出循环的条件,j如果等于0就要跳出循环,因为没有0!及比0更小的阶乘;                break;        }        if(flag)            printf("Yes\n");        else            printf("No\n");    }    return 0;}

思路为借鉴,在设计代码时刚开始时让n减去小于n的最大的阶乘;

zhihou gaibian silu ,n1=n向下减,,同时之后加一个变量sum,让sum加上小于n的最大的阶乘;

注意break条件!

0 0