假期刷题打卡--Day19

1、MT1171幻数

一个数字,把他的各位数累加会得到一个新的数字,再把这个新数字的每一位加起来,重复这个过程,直到只剩下一位数字,如果最后剩下的数字是1,就称原数为一个幻数。输入正整数N,检查它是否是一个幻数,输出YES或者NO。

格式

输入格式:

输入正整数N

输出格式:

输出YES或者NO

样例 1

输入:

1234

输出:

YES
解决思路

(参考轩哥码题 : 【码蹄集新手村全题解09】选择结构 MT1168 – MT1184_哔哩哔哩_bilibili

本题的突破点在于直到只剩下一位数字,所以循环结束的条件就是n>=10,里面循环的就是计算输入数的每位数之和,然后在每次内层循环之后,把和赋值给n继续运算。然后,最后判断n的值是否为1,若为1,则是幻数,若不为1,则不为幻数,输出NO。

实现代码
#include 

using namespace std;

int count = 0;


int main( )
{
    int n;
    cin >> n;
    int tmp;
    while(n>=10){
        tmp = 0;
        while(n != 0){
            tmp += n%10;//求每位数的和
            n/=10;
        }
        n = tmp;
    }
    if(n==1) cout << "YES";
    else cout << "NO";
    return 0;
}

2、MT1172完美数字

输入正整数N,检查它是否完美输出YES或者NO。把一个数字的每一位拆分开,计算他们的阶乘再累加,如果和等于原数字,则该数字是完美的。

格式

输入格式:

输入正整数N

输出格式:

输出YES或者NO

样例 1

输入:

145

输出:

YES
解决思路

因为在实现的过程中需要求输入数的位数个阶乘(例如输入145,位数就是3,那么就要求三个阶乘,1、4、5这三个数的阶乘),所以写一个函数专门用来计算每位数的阶乘。在主函数中实现求每位数的阶乘之和,然后与n进行比较,如果相等,则证明是完美数字,输出“YES”;若不等,则输出“NO”。

实现代码
#include 

using namespace std;

int f(int a){
    int t = 1;
    for(int i = 1;i<=a;i++)
        t=t*i;
    return t;
    
}
int main( )
{
    int m,sum=0;
    cin >> m;
    int n = m;
    while(n!=0){
        sum+=f(n%10); 
        n/=10;
      // cout << "n=" << n << " sum=" << sum << endl;
    }
    // cout << sum;
    if(sum==m) cout << "YES";
    else cout << "NO";
    return 0;
}

 

明天继续吧。

你可能感兴趣的:(假期打卡学习,算法,c++,数据结构)