假期刷题打卡--Day18

1、MT1168阶乘数

输入正整数N,找出它是否是一个等于其他数的阶乘值的数,输出YES或者NO。

格式

输入格式:

输入正整数N

输出格式:

输出YES或者NO

样例 1

输入:

5

输出:

NO
相关知识点
阶乘

可以理解为:小于等于某个正整数的所有正整数的乘积。

例如:5 的阶乘(记作 5!)= 5 × 4 × 3 × 2 × 1

1到10的阶乘数如下:

1! = 1

2! = 2 × 1 = 2

3! = 3 × 2 × 1 = 6

4! = 4 × 3 × 2 × 1 = 24

5! = 5 × 4 × 3 × 2 × 1 = 120

6! = 6 × 5 × 4 × 3 × 2 × 1 = 720

7! = 7 × 6 × 5 × 4 × 3 × 2 × 1 = 5040

8! = 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 40320

9! = 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 362880

10! = 10 × 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 3628800

阶乘数(与本题无关,仅供了解)

(来自百度百科      阶乘数_百度百科 (baidu.com))

定义:阶乘数是一种有着特殊规律、每位以阶乘为权的数字。

公式:abcd=a*a!+b*b!+c*c!+d*d! 。即:该数据的值等于各个位上数字乘以其阶乘数之和。

        例:

分析过程

         这里判断的是阶乘值,而不是阶乘数,不要因为这个题目被忽悠了。我看到这个题目我就去搜了一下什么是阶乘数,然后怎么想都觉得不太合适,怎么都计算不出正确结果,然后我就看了一下别人的思路,发现是求的某个数阶乘的值,查看是否是某个数的阶乘。就比如说,如果输入1,就是1的阶乘值;输入2,可以认为是2的阶乘(2*1=2);输入6,就是3的阶乘值(3*2*1=6)等等。

         所以说,这个题就是去查看输入的数是否是某个数的阶乘。

如果用例不多的话,可以直接按照常见的几个阶乘排除即可。

#include 

using namespace std;

int main( )
{
    int n;
    cin >> n;
    if(n==1||n==2||n==6||n==24||n==120||n==720){
        cout << "YES";
    }else{
        cout << "NO";
    }

    return 0;
}

也可以使用循环结构一一查看。

实现思路:首先,设置一个总数,sum=1(用来计算阶乘值),再设置一个flag(用来判断是否有满足条件的sum,即sum==n),设置初值为0,然后设置一个循环(while循环或者for循环),在循环里面判断输入值是否满足条件。

实现代码
#include 

using namespace std;

int main( )
{
    int n,sum=1,flag=0;
    cin >> n;
    for(int i=1;sum<=n;i++){//也可以是i<=n
        sum*=i;
        if(sum==n){
            cout << "YES";
            flag = 1;
            break;
        }
    }
    if(flag==0){
        cout << "NO";
    }
    return 0;
}
#include 

using namespace std;

int main( )
{

    int n,x=1,c=1;
    cin >> n;
    // cout << n << "$$";
    while(c

2、MT1170四叶玫瑰数

输入正整数N,判断它是不是一个四叶玫瑰数,输出YES或者NO。四位玫瑰数是4位数的自幂数,它的每个位上的数字的4次幂之和等于它本身。

格式

输入格式:

输入正整数N

输出格式:

输出YES或者NO

样例 1

输入:

1634

输出:

YES
相关知识点
自幂数:

定义:指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。

例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数

0到9是自幂数,但是不是四页玫瑰树。

分析过程

 此题就是要判断输入数是否等于它每个位上n次方的平方,这里n是4。

例:

1634就是去判断1634是否等于1的4次方+6的4次方+3的4次方+4的次方。

所以,按照上述思路,第一次写的代码:
 

#include 

using namespace std;

int main( )
{
    int n;
    cin >> n;
//这里求输入数的每个数的4次幂,第二三四位不仅需要使用除法解决,还要用求余来求出
    int m = (pow(n/1000,4)+pow(n/100%10,4)+pow(n/10%10,4)+pow(n/1%10,4));
    if(n==m){
        cout << "YES";
    }else{
        cout << "NO";
    }
    return 0;
}

 但是,上面代码只能通过一个用例:

假期刷题打卡--Day18_第1张图片

按照评论区的想法,加一个判断语句,也只能过两个用例:

#include 

using namespace std;

int main( )
{
    int n;
    cin >> n;
    int m;
    if(n>999 && n<10000)
        m = (pow(n/1000,4)+pow(n/100%10,4)+pow(n/10%10,4)+pow(n/1%10,4));
    if(n==m){
        cout << "YES";
    }else{
        cout << "NO";
    }
    return 0;
}

假期刷题打卡--Day18_第2张图片

 然后,继续修改:

发现,没有考虑到0这个特殊情况(也可以说没有考虑到不是四位数的自幂数),所以,就在判断的时候加上n!=0就可以通过了(不过这个可能是凑巧通过了这道题的用例,放到其他用例上有可能还是不太正确),所以,要在考虑的时候查看输入值是否是四位数,如果是,则按照自幂数的方式进行计算看是否满足条件,如果不是,则直接输出NO,并结束(若不结束,则可能会出现继续往下面判断的情况,即有可能输出NOYES,或者其他情况)。

实现代码
#include 

using namespace std;

int main( )
{
    int n;
    cin >> n;
    int m;

    if(n>999 && n<10000)
        m = (pow(n/1000,4)+pow(n/100%10,4)+pow(n/10%10,4)+pow(n%10,4));
    if(m==n && n!=0){
        cout << "YES";
    }else{
        cout << "NO";
    }
    return 0;
}

或者:

#include 

using namespace std;

int main( )
{
    int n;
    cin >> n;
    int m;

    if(n>999 && n<10000){
    	m = (pow(n/1000,4)+pow(n/100%10,4)+pow(n/10%10,4)+pow(n%10,4));
	}else{
		cout << "NO";
		return 0;
	}  
    if(m==n ){
        cout << "YES";
    }else{
        cout << "NO";
    }
    return 0;
}

不过,一个代码尽量不要出现多个出口,所以直接把判断语句写到上面就可以了。

#include 

using namespace std;

int main( )
{
    int n;
    cin >> n;
    int m;

    if(n>999 && n<10000){
    	m = (pow(n/1000,4)+pow(n/100%10,4)+pow(n/10%10,4)+pow(n%10,4));
        if(m==n ){
            cout << "YES";
        }else{
            cout << "NO";
        }
	}else{
		cout << "NO";
	}     
    return 0;
}

明天继续吧。

你可能感兴趣的:(假期打卡学习,c++,c语言)