CCF GESP 2023年12月认证 C++ 2级 C2 编程题2

本题为CCF GESP官方模拟题。

第二题

试题名称:数字黑洞

时间限制:1.0 s

内存限制:128.0 MB

问题描述

给定一个三位数,要求各位不能相同。例如,352是符合要求的,112是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。神奇的是,最终一定会得到495!

试试看,重新排列352,得到的最大数为532,最小数为235,它们的差是297;变换297,得到972-279=693;变换693,963-369=594;变换594,954-459=495。因此,352经过4次变换得到了495。

现在,输入的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到495吗?

输入描述

输入一行,包含一个符合要求的三位数N。

输出描述

输出一行,包含一个整数C,表示经过C次变换得到495。

样例输入1

352

样例输出1

4

语言及编译选项

#

名称

编译器

额外参数

代码长度限制

1

g++ with std11

g++

-O2 -std=c++11 -DONLINE_JUDGE

65536 B

题目分析

这是一个关于数字变换的编程问题。

程序接收一个三位数作为输入,然后通过计算变换,找出需要多少次变换才能得到495。

首先,接收一个三位数,将输入的数字分解为各位数字。

然后,通过冒泡排序法将这个三位数的三个数字重新排列,得到最大的数和最小的数,并计算它们的差。

然后,对这个差重复上述过程,直到得到495。

最后输出次数。



代码

#include <iostream>  
using namespace std;  

void swapNumber(int* a, int* b)
{
    int temp = *b;
    *b       = *a;
    *a       = temp;
}

void bubbleSort(int* array, int size) {
	bool b;
    for(int i=size;i>=1;i--)
    {
        b=false;
        for(int j=0;j<i-1;j++)
        {
            if(array[j]>array[j+1])
            {
                swapNumber(&array[j],&array[j+1]);
                b=true;
            }
        }
        if(b==false) break;
    }
}
int main() {  
    int num, count = 0; 
    cin >> num;
  
    while (num != 495) {  
        // 将数字分解为各位数字  
        int digits[3];  
        for (int i = 0; i < 3; i++) {  
            digits[i] = num % 10;  
            num /= 10;  
        }
        
		//冒泡排序        
        bubbleSort(digits,3);
        
        // 排序并重新组合成最大和最小的三位数  
        int max_num = (digits[2] * 100 + digits[1] * 10 + digits[0]);  
        int min_num = (digits[0] * 100 + digits[1] * 10 + digits[2]);  
  
        // 计算差值并更新输入数字  
        num = max_num - min_num;  
        count++;  
    }  
  
    cout << count << endl;  
    return 0;  
}

程序逻辑是这样的:

1,程序定义了一个交换两个整数的函数 swapNumber,该函数通过指针接收两个整数,然后将这两个整数交换。

2,程序定义了一个冒泡排序函数 bubbleSort,该函数接收一个整数数组和数组的大小,然后对数组进行冒泡排序。

3,main 函数中,程序首先接收一个整数输入 num。

4,接着,程序进入一个循环,只要 num 不等于 495,就继续循环。

5,在循环中,程序首先将 num 分解为各位数字,并将这些数字存储在数组 digits 中。

6,然后,程序使用 bubbleSort 函数对 digits 数组进行排序。

7,接下来,程序将排序后的 digits 数组重新组合成两个三位数,一个是最大的三位数,另一个是最小的三位数。

8,然后,程序计算这两个三位数的差值,并将这个差值赋值给 num。

9,循环结束后,程序输出循环的次数 count。


大家有没有更好的编程思路?有的话,多多跟我分享哈,谢谢!

我是dino同学,正在认真学习C++编程和开源硬件,请大家多多关注,多多指导!