第四届_带分数

本文介绍了一个算法问题,即如何找出一个正整数可以用1到9这九个数字组成的带分数形式的不同表示方法的数量。通过使用暴力枚举的方法,程序能够找到所有可能的组合,并验证这些组合的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。  还可以表示为:100 = 82 + 3546 / 197。注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100 有 11 种表示法。
输入一个正整数N (N<1000*1000)
输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
例如:
用户输入:
100
程序输出:
11
#include <stdio.h>
#include <string.h>
//思路:暴力枚举法 
char flag[10];    //用于标记"#123456789"是否已经被选 
char backup[10];  //用于临时保存数据 

//检查"#123456789"每个数据是否只有一个 
int check(int n) 
{
	do 
  	{
  		++flag[n%10];  //统计数字:如n = 123;则++flag[3],++flag[2],++flag[1]   
  	}while(n /= 10);
  	if(flag[0] != 0) //如果存在0 
    	return 1;      //返回冲突 
  	for(int i = 1; i < 10; i++) 
    	if(flag[i] > 1)//如果存在某个数据不只有1个 
      		return 1;    //返回冲突 
  	return 0;        //返回正确 
}

//检查是否每个数据都已经存在 
int checkAll(void)
{ 
	for(int i = 1; i < 10; i++) 
    	if(flag[i] != 1) 
      		return 1;//不全部包括 
  	return 0;    //全部包括 
}

int main(void)
{ 
	int i = 0; 
    int num = 0;        //输入数据 
    int count = 0;      //统计个数 
    scanf("%d", &num); 
    int left = 0, up = 0, down = 0;   //带分数 
    for(left = 1; left < num; ++left) //先从带分数的左边开始增加 
    {
  		for (i = 0; i < 10; ++i)        //将标记数组全部初始化为0 
	  		flag[i] = 0; 
    	if(check(left))                 //检查左边数据合理性 
      		continue;//不合理
		for (i = 0; i < 10; ++i)        //缓存flag数据,用于下面for循环重置 
			backup[i] = flag[i]; 
   		for(down = 1; down < 100000; ++down) //再增加带分数底数 
		{
      		for (i = 0; i < 10; ++i)      //重置flag
				flag[i] = backup[i]; 
      		up = (num - left) * down;     //计算出up值 
      		if(check(down) || check(up))  //检查数据合理性 
        		continue;//不合理 
      		if(!checkAll()) 
	  		{
        	//	printf("%d = %d + %d / %d\n", num, left, up, down);
        		++count; //计数+1 
      		}
    	}
  	}
  	printf("%d\n", count);//打印总共个数 
        return 0;
}


第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛 C/C++高职高专组 1、题目标题: 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说: “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字每个都恰好现1次。” 请你推算一下,他当时到底有多年轻。 通过浏览器,直接提交他那时的年龄数字。    注意:不要提交解答过程,或其它的说明文字。                     2、标题: 马虎的算式             小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。         有一次,老师的题目是:36 x 495 = ?         他却给抄成了:396 x 45 = ?         但结果却很戏剧性,他的答案竟然是对的!!         因为 36 * 495 = 396 * 45 = 17820         类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54         假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)         能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?            请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。        满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。            答案直接通过浏览器提交。    注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。         3、标题: 振兴中华         小明参加了学校的趣味运动会,其中的一个项目是:跳格子。         地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)        从 我 做 起 振    我 做 起 振 兴    做 起 振 兴 中    起 振 兴 中 华             比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。             要求跳过的路线刚好构成“从我做起振兴中华”这句话。         请你帮助小明算一算他一共有多少种可能的跳跃路线呢?        答案是一个整数,请通过浏览器直接提交该数字。    注意:不要提交解答过程,或其它辅助说明类的内容。    a=从    b=我    c=做    d=起    e=振    f=兴    g=中    h=华                     4、标题: 幻方填空         幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。         欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给一个4阶幻方。         他把1,2,3,...16 这16个数字填写在4 x 4的方格中。         如图p1.jpg所示,即:        16 ? ? 13    ? ? 11 ?    9 ? ? *    ? 15 ? 1         表中有些数字已经显露来,还有些用?和*代替。         请你计算? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。            答案是一个整数,请通过浏览器直接提交该数字。    注意:不要提交解答过程,或其它辅助说明类的内容。         5、题目标题:公约数公倍数         我们经常会用到求两个整数的最大公约数和最小公倍数的功能。         下面的程序给了一种算法。         函数 myfunc 接受两个正整数a,b         经过运算后打印 它们的最大公约数和最小公倍数。         此时,调用 myfunc(15,20)        将会输:    3    60        // 交换数值    void swap(int *a,int *b)    {     int temp;     temp=*a;     *a=*b;     *b=temp;    }        void myfunc(int a, int b)    {     int m,n,r;     if(a<b) swap(&a,&b);     m=a;n=b;r=a%b;     while(r!=0)     {     a=b;b=r;     r=a%b;     }     printf("%d\n",b); // 最大公约数     printf("%d\n", ____________________________________); // 最小公倍数    }            请分析代码逻辑,并推测划线处的代码,通过网页提交。    注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!         6、标题:三部排序         一般的排序有许多经典算法,如快速排序、希尔排序等。         但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。         比如,对一个整型数组中的数字进行分类排序:         使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!         以下的程序实现了该目标。         其中x指向待排序的整型数组,len是数组的长度。        void sort3p(int* x, int len)    {     int p = 0;     int left = 0;     int right = len-1;         while(p<=right){     if(x[p]<0){     int t = x[left];     x[left] = x[p];     x[p] = t;     left++;     p++;     }     else if(x[p]>0){     int t = x[right];     x[right] = x[p];     x[p] = t;     right--;     }     else{     __________________________; //填空位置     }     }        }         如果给定数组:     25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0     0 ,18,-2,0,16,-5,33,21,0,19,-16,25,-3,25         则排序后为:     -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25                请分析代码逻辑,并推测划线处的代码,通过网页提交    注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!         7、标题:核桃的数量         小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:         1. 各组的核桃数量必须相同     2. 各组内必须能平分核桃(当然是不能打碎的)     3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)        程序从标准输入读入:    a b c    a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)        程序输:    一个正整数,表示每袋核桃的数量。        例如:    用户输入:    2 4 5        程序输:    20        再例如:    用户输入:    3 1 1        程序输:    3                资源约定:    峰值内存消耗(含虚拟机) < 64M    CPU消耗 < 1000ms            请严格按要求输,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。         8、题目标题:打印十字图         小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)         $$$$$$$$$$$$$     $ $     $$$ $$$$$$$$$ $$$     $ $ $ $     $ $$$ $$$$$ $$$ $     $ $ $ $ $ $     $ $ $$$ $ $$$ $ $     $ $ $ $ $ $ $     $ $ $ $$$$$ $ $ $     $ $ $ $ $ $ $     $ $ $$$ $ $$$ $ $     $ $ $ $ $ $     $ $$$ $$$$$ $$$ $     $ $ $ $     $$$ $$$$$$$$$ $$$     $ $     $$$$$$$$$$$$$             对方同时也需要在电脑dos窗口中以字符的形式输该标志,并能任意控制层数。         为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。        输入格式:    一个正整数 n (n<30) 表示要求打印图形的层数        输:    对应包围层数的该标志。        例如:    用户输入:    1    程序应该输:    ..$$$$$..    ..$...$..    $$$.$.$$$    $...$...$    $.$$$$$.$    $...$...$    $$$.$.$$$    ..$...$..    ..$$$$$..        再例如:    用户输入:    3    程序应该输:    ..$$$$$$$$$$$$$..    ..$...........$..    $$$.$$$$$$$$$.$$$    $...$.......$...$    $.$$$.$$$$$.$$$.$    $.$...$...$...$.$    $.$.$$$.$.$$$.$.$    $.$.$...$...$.$.$    $.$.$.$$$$$.$.$.$    $.$.$...$...$.$.$    $.$.$$$.$.$$$.$.$    $.$...$...$...$.$    $.$$$.$$$$$.$$$.$    $...$.......$...$    $$$.$$$$$$$$$.$$$    ..$...........$..    ..$$$$$$$$$$$$$..        请仔细观察样例,尤其要注意句点的数量和输位置。            资源约定:    峰值内存消耗 < 64M    CPU消耗 < 1000ms            请严格按要求输,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。                 9、标题:带分数         100 可以表示为带分数的形式:100 = 3 + 69258 / 714         还可以表示为:100 = 82 + 3546 / 197         注意特征:带分数中,数字1~9分别现且只现一次(不包含0)。         类似这样的带分数,100 有 11 种表示法。        题目要求:    从标准输入读入一个正整数N (N<1000*1000)    程序输数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。    注意:不要求输每个表示,只统计有多少表示法!            例如:    用户输入:    100    程序输:    11        再例如:    用户输入:    105    程序输:    6            资源约定:    峰值内存消耗 < 64M    CPU消耗 < 3000ms            请严格按要求输,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。                 10、标题:剪格子         如图p1.jpg所示,3 x 3 的格子中填写了一些整数。         我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。         本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。     如果存在多种解答,请输包含左上角格子的那个区域包含的格子的最小数目。     如果无法分割,则输 0        程序输入格式要求:        程序先读入两个整数 m n 用空格分割 (m,n<10)    表示表格的宽度和高度    接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000    程序输:在所有解中,包含左上角的分割区可能包含的最小的格子数目。            例如:    用户输入:    3 3    10 1 52    20 30 1    1 2 3        则程序输:    3        再例如:    用户输入:    4 3    1 1 1 1    1 30 80 2    1 1 1 100        则程序输:    10        (参见p2.jpg)            资源约定:    峰值内存消耗 < 64M    CPU消耗 < 5000ms            请严格按要求输,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。            
### 关于第十四届蓝桥杯 C++ 程序设计省赛 B 组的信息 #### 1. **考试大纲** 根据大赛官方说明,C/C++大学 B 组解题所需掌握的知识涵盖了以下内容[^3]: - 结构、数组、指针、标准输入、文件操作、递归、基本数据结构(ANSI C/C++范围内)。 - 高校《数据结构》教材中的经典结构及其变种。 - 函数指针、位运算。 - 基本数学知识,包括解析几何、线性代数、微积分、概率、复平面基本性质。 这些知识点不仅限于理论理解,还需要能够熟练应用于实际编程问题解决中。因此,在准备过程中应注重实践练习和算法优化能力的提升。 --- #### 2. **题目构成与特点** 虽然具体题目尚未公开,但基于以往的比赛经验,可以推测一些规律: - **题目数量**:通常设置为10道题,其中包括填空题和编程大题两类[^1]。 - **分数分布**:每道题目的分值可能有所不同,一般会按照难度分配权重,例如简单的填空题占较少比例而复杂的编程题则占据较大比重。 - **考察方向**:重点覆盖思维逻辑、基础数据结构应用、动态规划(DP)、搜索策略、数学建模等方面的能力测试。 特别需要注意的是,B组相较于其他级别增加了更多高级别的技术要求,比如更深入的数据处理技巧以及复杂场景下的解决方案构建等要素。 --- #### 3. **典型例题分析及解法思路** 以下是针对某类可能现的问题提供的一种通用思考方式,并附带相应实现代码作为参考实例之一: 假设存在这样一个问题——给定一段字符串序列S, 让我们找其中连续相同字符或者含有问号'?'的最大子串长度. ##### 解决方案描述: 为了高效完成上述任务, 我们可以通过遍历整个字符串来逐一判断相邻两个位置上的关系是否满足条件(即相等或者是任意匹配). 如果符合条件,则增加计数值;否则重置计数器并继续查找下一个潜在目标区域. 最后返回最大记录下来的次数即可表示最终结果.[^4] 下面是该方法的具体编码表现形式: ```cpp #include <iostream> #include <cstring> using namespace std; const int MAX_LEN = 1e6 + 10; char str[MAX_LEN]; int main(){ cin >> str; int length = strlen(str); long count = 0; for(int idx=0 ;idx<length-1; ++idx){ if((str[idx]==str[idx+1]) || (str[idx]=='?') || (str[idx+1]=='?')){ count++; idx++; // Skip next character since it's already counted as part of current pair } } cout << count << endl; return 0; } ``` 此段程序利用双重循环机制简化成单层迭代过程从而提高了运行效率同时也保持了清晰易懂的特点适合初学者理解和模仿学习. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值