前言:
现在朋友们对“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语言编程逻辑训练题