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<bits/stdc++.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
using namespace std;
int main( )
{
int n,x=1,c=1;
cin >> n;
// cout << n << "$$";
while(c<n){
x++;
c*=x;
// cout << c << "*" << x << "dd";
}
if(c==n){
cout << "YES";
}
else
cout << "NO";
return 0;
}
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<bits/stdc++.h>
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;
}
但是,上面代码只能通过一个用例:
按照评论区的想法,加一个判断语句,也只能过两个用例:
#include<bits/stdc++.h>
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;
}
然后,继续修改:
发现,没有考虑到0这个特殊情况(也可以说没有考虑到不是四位数的自幂数),所以,就在判断的时候加上n!=0就可以通过了(不过这个可能是凑巧通过了这道题的用例,放到其他用例上有可能还是不太正确),所以,要在考虑的时候查看输入值是否是四位数,如果是,则按照自幂数的方式进行计算看是否满足条件,如果不是,则直接输出NO,并结束(若不结束,则可能会出现继续往下面判断的情况,即有可能输出NOYES,或者其他情况)。
实现代码
#include<bits/stdc++.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
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;
}
明天继续吧。