龙空技术网

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

dino同学 48

前言:

现在朋友们对“c语言编程逻辑训练题”大约比较看重,姐妹们都想要分析一些“c语言编程逻辑训练题”的相关资讯。那么小编在网上网罗了一些有关“c语言编程逻辑训练题””的相关知识,希望小伙伴们能喜欢,小伙伴们一起来了解一下吧!

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

标签: #c语言编程逻辑训练题