C++将整数换成分数 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
目录
C++将整数换成分数
一、题目要求
1、编程实现
2、输入输出
二、算法分析
三、程序编写
四、运行结果
五、考点分析
六、 推荐资料
1、C++资料
2、Scratch资料
3、Python资料
C++将整数换成分数
2024年信息素养大赛 C++复赛真题解析
一、题目要求
1、编程实现
一个小于 100 万的正整数 n,尝试把n变成带分数形式,也就是 n=a+b/c,其中 a,b,c是三个正整数,并且数字 1~9(不含 0)在 a、b、c中,必须出现,且只能出现一次。例如:100=3+69258/714其中1到9这9个数字全都出现了,并且只 出现一次。当然100 还等于 82+ 3546/197,也就是说将 100 变成带分数形式,会有两种组合方式。事实上 100,可以写成 11种1到 9组成整数加上分数的形式。请编写一个程序,根据一个输入 N,程序输出该数字用数码 1~9 不重复不遗漏地,组成带分数表示的全部可能性。不要求输出每个表示,只输出有多少种表示法!
2、输入输出
输入描述:输入一行,表示要分解的正整数。
输出描述:只有一行,一个整数,即有多少种表示法
输入样例:
100
输出样例:
11
二、算法分析
- 从给定题目的初步分析可以看出,拿到这道题可能小朋友们不知道如何入手
- 也有的小朋友可能会直接从a,b,c三个数字入手,采用三重循环完成,但是n是10的6次方,三重循环也就是n的18次方,直接超时了;显然暴力破解不可取
- 那有什么方法比较合适呢,可以换个思路从三个数对应的位数出发,因为n是一个小于100万的整数,n的最大位数就是7位
- 题目还明确告知a,b,c这三个数都是1到9的不重复数字,且必须都包含,所以这其实是一个数学的排列问题,可以直接使用STL里面的next_permutation进行排列
- 接着可以将每次排列后的组合进行分割,分成3部分,a是第一部分,b是中间部分,c是最后部分;先考虑数字a,最大就是一个7位数;而b和c至少是一个一位数
- 接着只要按分割的位数进行遍历,接着满足a+b/c=n,同时b/c是一个整数即可
三、程序编写
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int getCount(int n) {vector<int> nums = {1,2,3,4,5,6,7,8,9};int res = 0;do {for (int ai = 1; ai <= 7; ++ai) { // a最多7位数int a = 0;for (int i = 0; i < ai; ++i) a = a * 10 + nums[i];if (a >= n) break; // 剪枝:a >= n时跳过for (int bi = ai + 1; bi <= 8; ++bi) { //b c至少1位int b = 0;for (int i = ai; i < bi; ++i) b = b * 10 + nums[i];int c = 0;for (int i = bi; i < 9; ++i) c = c * 10 + nums[i];if (b % c == 0 && a + b / c == n) res++;}}} while (next_permutation(nums.begin(), nums.end()));return res;
}int main() {int n;cin >> n;cout << getCount(n) << endl;return 0;
}
本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102
四、运行结果
100
11888
4
五、考点分析
难度级别:难,这题相对而言有一定的难度,在于思路的转变,具体主要考察如下:
- 分析题目 找到解题思路
- 充分掌握变量的定义和使用
- 学会排列组合函数next_permutation的使用
- 学会数字的分割和思路转换,以及优化
- 学会输入流对象cin的使用,从键盘读入相应的数据
- 学会for循环的使用,在确定循环次数的时候推荐使用学会
- 学会while循环的使用,在不确定循环次数的时候推荐使用
- 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
- 学会if...else...双分支语句的使用,条件满足执行一种处理,不满足执行另一种处理
- 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
- 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
- 充分掌握变量定义和使用、分支语句、循环语句和简单算法知识的使用及输入输出的用法
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!
六、 推荐资料
- 所有考级比赛学习相关资料合集【推荐收藏】
1、C++资料
- 电子学会C++一级历年真题解析
- 电子学会C++二级历年真题解析
- 蓝桥杯C++选拔赛真题解析
2、Scratch资料
- Scratch3.0系列视频课程资料
- 零基础学习scratch3.0【入门教学 免费】
- 零基础学习scratch3.0【视频教程 114节 免费】
- 历届蓝桥杯scratch国赛真题解析
- 历届蓝桥杯scratch省赛真题解析
- 历届蓝桥杯scratch STEMA选拔赛真题解析
- 历届蓝桥杯科技素养计算思维真题解析
- 蓝桥杯专项训练考前集训100题
- 画图-scratch编程考级99图
- 电子学会历年scratch等级考试一级真题解析
- 电子学会历年scratch等级考试二级真题解析
- 电子学会历年scratch等级考试三级真题解析
- 电子学会历年scratch等级考试四级真题解析
3、Python资料
- 蓝桥杯python选拔赛真题详解
-
蓝桥杯python省赛真题详解
-
蓝桥杯python国赛真题详解
-
python等级一级真题解析【电子学会】
-
python等级二级真题解析【电子学会】
-
python等级三级真题解析【电子学会】
-
python等级四级真题解析【电子学会】