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++编程和开源硬件,请大家多多关注,多多指导!