• ACM 阶乘之和


    阶乘之和

    时间限制: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

    方法:(算法思路错误,只适用于该题)
    facs是n!
    sums是1!+2!+3!+……+n!
    判断一个数是否是相加和,如果大于sums[x],那么它的相加的数里必定有一个最大数是facs[x+1]。减去这个最大数,然后继续循环判断是否大于sums[x],
    依次减去最大数,直到减到0为止。如果减到最后不是0,那么就不是相加和。

    发现一个规律,这个数必定在 facs[x]和sums[x]之间。
    #include<iostream>
    using namespace std;
    
    int facs[10] = {0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
    int sums[10] = {0, 1, 3, 9, 33, 153, 873, 5913, 46233, 409113};
    
    int main()
    {
        int n;
        cin>>n;
        while(n--)
        {
            int x;
            cin>>x;
            int i = 9;
            for(;i > 0; i--)
            {
                if(x > sums[i])
                {
                    if(x < facs[i + 1])
                        break;
                    else
                        x -= facs[i + 1];
                }
                else if(x == sums[i])
                {
                    x = 0;
                    break;
                }
            }
            if(x != 0)
                cout << "No" << endl;
            else
                cout << "Yes" << endl;
        }
        return 0;
    }

    适用于该题的最简单算法

     
    #include<iostream>
    using namespace std;
    
    int main()
    {
        int n;
        int k[9]={1,2,6,24,120,720,5040,40320,362880};
        cin>>n;
        while(n--)
        {
            bool flag=false;
            int m;
            cin>>m;
            for(int i=8;i>=0;i--)
            {
                if(m>=k[i] && m>0)
                    m-=k[i];
                if(m==0)
                    flag=true;
            }
            if(flag)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
    }        
  • 相关阅读:
    iOS 7用户界面过渡指南
    断言
    UIView的任意圆角
    ios与js交互获取webview元素和赋值
    JSONModel解析Dictionary To Model /JSON To Model
    Mac测试模拟慢网速
    MySQL批量调整数据表里的日期
    博客园查询自己网站二级目录被百度收录的情况
    windows文件夹里批量更新文件后缀
    git 学习
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/4572473.html
Copyright © 2020-2023  润新知