【2023年莆田市第三期C++专项第一轮选拔真题(小学组)】数位积 题解

数位积

题目描述

一个数各位数相乘得到的结果称为数位积,输入一个整数n,循环计算其数位积,直到其数位积为个位数时,输出其计算次数

输入格式

第一行 一个整数 n,分别表示初始值;

输出格式

一行 一个整数,表示数位积的计算次数。
样例数据

样例输入 #1

6432

样例输出 #1

3

样例解释

第一次:6432位数积 6*4*3*2=144
第二次:144位数积 1*4*4=16
第三次:16位数积 1*6=6

数据范围

对于 20% 的数据,n%10=0;
对于 40% 的数据,含有且含有n含有2且含有5;
对于 100% 的数据,1≤n≤1015。

解题思路

  1. 输入处理:读取用户输入的整数n。
  2. 循环计算数位积:
    • 只要n不是个位数(即n/10不为0),就继续计算。
    • 每次计算时,将n的各位数字相乘,得到新的n值。
    • 每次计算后,计数器cnt加1。
  3. 输出结果:当n变为个位数时,输出计数器cnt的值。

代码实现

20pt

n%10 == 0表示其个位数为0,第一次数位积后结果为0,次数为1

#include 
using namespace std;

int main() {
    long long n;
    cin >> n;
    
    if (n % 10 == 0)
        cout << 1;
    
    return 0;
}

40pt

n中含2含5,第一次数位积后个位数必为0且大于10,第二次数位积后结果为0,次数为2

#include 
using namespace std;

int main() {
    long long n;
    cin >> n;
    
    if (n % 10 == 0)
        cout << 1;
    else
        cout << 2;
    
    return 0;
}

100pt

循环判断n/10,满足就计算数位积,次数cnt++;不满足,输出cnt

#include 
using namespace std;

int main() {
    long long n;
    int cnt = 0;
    cin >> n;
    
    while (n / 10) {
        long long temp = n;
        n = 1;
        
        while (temp) {
            n *= temp % 10;
            temp /= 10;
        }
        
        cnt++;
    }
    
    cout << cnt;
    return 0;
}

代码解析

  1. 变量声明:
  • long long n:用于存储输入的整数,使用long long类型是为了处理大数(题目中n最大可达10^15)。
  • int cnt:用于记录计算次数,初始化为0。
  1. 输入处理:
  • 使用cin >> n读取用户输入的整数。
  1. 循环计算数位积:
  • 外层循环while(n / 10):只要n不是个位数(即n/10不为0),就继续循环。
  • 内层循环while(temp):计算n的各位数字的乘积。
    • temp % 10:获取n的最后一位数字。
    • n *= temp % 10:将该数字乘到n上。
  • temp /= 10:去掉n的最后一位数字。
  • 每次内层循环结束后,n的值变为当前各位数字的乘积,计数器cnt加1。
  1. 输出结果:
  • 当n变为个位数时,退出外层循环,使用cout << cnt输出计算次数。

边界情况处理

  • n为个位数:此时n / 10为0,循环不会执行,直接输出0。
  • n包含0:任何数乘以0都会变为0,因此如果n的各位数字中包含0,数位积会迅速变为0,计算次数较少。
  • 大数处理:使用long long类型可以确保程序能够处理n的最大值10^15。

复杂度分析

时间复杂度:

最坏情况下,每次计算数位积时,需要遍历n的所有位数。假设n的位数为k,则每次计算的时间复杂度为O(k)。由于每次计算后n的位数会减少(除非n为0或1),因此总的时间复杂度可以近似为O(log n)(因为n的位数约为log10(n))。

空间复杂度:

O(1),只使用了常数个额外变量。

总结

本题通过循环计算数位积,直到其变为个位数为止,主要考察了基本的循环结构、数字处理和计数器的使用。通过合理的变量声明和循环控制,可以高效地解决问题。代码简洁明了,适用于处理大数情况。

你可能感兴趣的:(c++,算法,开发语言)