第五届蓝桥杯大赛个人赛省赛(软件类)真题(C语言A组)
2016-03-16 21:26
1086 查看
1. 猜年龄
小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”请你写出:小明的较小的妹妹的年龄。
注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。
答案:10
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int flag = 0; for(int i = 1; i < 20; i++){ for(int j = 1; j < 20; j++){ if(j-i>8) break; else{ if(i*j==6*(i+j)){ flag = 1; printf("%d %d\n", i, j); break; } } } if(flag) break; } return 0; }
2. 切面条
一根高筋拉面,中间切一刀,可以得到2根面条。如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
答案:1025
折叠0次:2
折叠1次:3=2*2-1
折叠2次:5=3*2-1
折叠3次:9=5*2-1
折叠4次:17=9*2-1
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int fun(int n){ if(n == 0) return 2; else return 2*fun(n-1)-1; } int main() { printf("%d\n", fun(10)); return 0; }
3. 神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
答案:12; 算出来之后记得比对一下,这个算法算出来是18个,但是两位数的数字是有重复的,去掉就可以了
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int num[10]; int main() { int cnt = 0; for(int i = 1; i < 10; i++){ for(int j = 100; j < 1000; j++){ memset(num, 0, sizeof(num)); int a = j%10; int b = j/10%10; int c = j/100; if(a==i || b==i || c==i || a==b || a==c || b==c) continue; else{ int res = i*j; if(res < 1000) continue; else{ int d = res%10; int e = res/10%10; int f = res/100%10; int g = res/1000; if(d==e || d==f || d==g || e==f || e==g || f==g) continue; num[i] = num[a] = num = num[c] = 1; if(num[e]==1 && num[f]==1 && num[d]==1 && num[g]==1){ cnt++; printf("%d %d\n", i, j); } } } } } for(int i = 10; i < 100; i++){ int a = i%10; int b = i/10; if(a == b) continue; for(int j = 10; j < 100; j++){ memset(num, 0, sizeof(num)); int c = j%10; int d = j/10; if(a==c || a==d || b==c || b==d || c==d) continue; else{ int res = i*j; if(res < 1000) continue; else{ num[a] = num[b] = num[c] = num[d] = 1; int e = res%10; int f = res/10%10; int g = res/100%10; int h = res/1000; if(e==f || e==g || e==h || f==g || f==h || g==h) continue; if(num[e]==1 && num[f]==1 && num[g]==1 && num[h]==1){ cnt++; printf("%d %d\n", i, j); } } } } } printf("%d\n", cnt); return 0; }
[b]4. 史丰收速算
史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!速算的核心基础是:1位数乘以多位数的乘法。
其中,乘以7是最复杂的,就以它为例。
因为,1/7 是个循环小数:0.142857…,如果多位数超过 142857…,就要进1
同理,2/7, 3/7, … 6/7 也都是类似的循环小数,多位数超过 n/7,就要进n
下面的程序模拟了史丰收速算法中乘以7的运算过程。
乘以 7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。
乘以 7 的进位规律是:
满 142857… 进1,
满 285714… 进2,
满 428571… 进3,
满 571428… 进4,
满 714285… 进5,
满 857142… 进6
请分析程序流程,填写划线部分缺少的代码。
//计算个位 int ge_wei(int a) { if(a % 2 == 0) return (a * 2) % 10; else return (a * 2 + 5) % 10; } //计算进位 int jin_wei(char* p) { char* level[] = { "142857", "285714", "428571", "571428", "714285", "857142" }; char buf[7]; buf[6] = '\0'; strncpy(buf,p,6); int i; for(i=5; i>=0; i--){ int r = strcmp(level[i], buf); if(r<0) return i+1; while(r==0){ p += 6; strncpy(buf,p,6); r = strcmp(level[i], buf); if(r<0) return i+1; ______________________________; //填空 } } return 0; } //多位数乘以7 void f(char* s) { int head = jin_wei(s); if(head > 0) printf("%d", head); char* p = s; while(*p){ int a = (*p-'0'); int x = (ge_wei(a) + jin_wei(p+1)) % 10; printf("%d",x); p++; } printf("\n"); } int main() { f("428571428571"); f("34553834937543"); return 0; }
注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字)
5. 锦标赛
如果要在n个数据中挑选出第一大和第二大的数据(要求输出数据所在位置和值),使用什么方法比较的次数最少?我们可以从体育锦标赛中受到启发。如图【1.png】所示,8个选手的锦标赛,先两两捉对比拼,淘汰一半。优胜者再两两比拼…直到决出第一名。
第一名输出后,只要对黄色标示的位置重新比赛即可。
下面的代码实现了这个算法(假设数据中没有相同值)。
代码中需要用一个数组来表示图中的树(注意,这是个满二叉树,不足需要补齐)。它不是存储数据本身,而是存储了数据的下标。
第一个数据输出后,它所在的位置被标识为-1
//重新决出k号位置,v为已输出值 void pk(int* a, int* b, int n, int k, int v) { int k1 = k*2 + 1; int k2 = k1 + 1; if(k1>=n || k2>=n){ b[k] = -1; return; } if(b[k1]==v) pk(a,b,n,k1,v); else pk(a,b,n,k2,v); //重新比较 if(b[k1]<0){ if(b[k2]>=0) b[k] = b[k2]; else b[k] = -1; return; } if(b[k2]<0){ if(b[k1]>=0) b[k] = b[k1]; else b[k] = -1; return; } if(______________________) //填空 b[k] = b[k1]; else b[k] = b[k2]; } //对a中数据,输出最大,次大元素位置和值 void f(int* a, int len) { int n = 1; while(n<len) n *= 2; int* b = (int*)malloc(sizeof(int*) * (2*n-1)); int i; for(i=0; i<n; i++){ if(i<len) b[n-1+i] = i; else b[n-1+i] = -1; } //从最后一个向前处理 for(i=2*n-1-1; i>0; i-=2){ if(b[i]<0){ if(b[i-1]>=0) b[(i-1)/2] = b[i-1]; else b[(i-1)/2] = -1; } else{ if(a[b[i]]>a[b[i-1]]) b[(i-1)/2] = b[i]; else b[(i-1)/2] = b[i-1]; } } //输出树根 printf("%d : %d\n", b[0], a[b[0]]); //值等于根元素的需要重新pk pk(a,b,2*n-1,0,b[0]); //再次输出树根 printf("%d : %d\n", b[0], a[b[0]]); free(b); } int main() { int a[] = {54,55,18,16,122,17,30,9,58}; f(a,9); }
请仔细分析流程,填写缺失的代码。
通过浏览器提交答案,只填写缺失的代码,不要填写已有代码或其它说明语句等。
7. 蚂蚁感冒
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
数据格式
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
要求输出1个整数,表示最后感冒蚂蚁的数目。
输入
35 -2 8
输出
1输入
5-10 8 -20 12 25
输出
3资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
刚开始暴力的,在练习系统上只过了50%的数据,摸摸头,还想不出来哪里错了,就换了个写法
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int num[55], f[55], b[55]; int main() { int n, a; while(scanf("%d", &n)!=EOF){ int cnt = 1; for(int i = 0; i < n; i++){ scanf("%d", &a); num[i] = abs(a); if(a > 0) f[i] = 1; else f[i] = -1; } int flag = f[0]; if(flag==1){ //感冒的蚂蚁往右走 for(int i = 1; i < n; i++){ //把向左走的蚂蚁都感染了 if(num[i] > num[0] && f[i]==-1){ cnt++; } } if(cnt > 1){ for(int i = 1; i < n; i++){ //把向右走的蚂蚁都感染了 if(num[i] < num[0] && f[i]==1) cnt++; } } } else{ //感冒的蚂蚁往左走 for(int i = 1; i < n; i++){ //把向右走的蚂蚁都感染了 if(num[i] < num[0] && f[i]==1){ cnt++; } } if(cnt > 1){ for(int i = 1; i < n; i++){ // 把向左走的蚂蚁都感染了 if(num[i] > num[0] && f[i]==-1) cnt++; } } } printf("%d\n", cnt); } return 0; }
相关文章推荐
- C++ 文件读取
- C++typede详解
- STM32 大小端模式 与 堆栈及其增长方向分析
- C++用模板实现双链表和队列
- C语言中函数返回值的问题
- C++标准模板库
- [转载] C++ string, const char*, char* 之间互相转换
- C语言小程序--交换两个变量的值
- C语言第一篇:C语言博客书写规范
- 朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言
- c语言:用结构体变量输出学生的信息,包括学号,姓名,性别。
- C语言之谈谈存储类、链接。
- 输出重定向函数
- 如何成为一个C++高级程序员
- C++中为什么要用虚函数、指针或引用才能实现多态?
- c语言:通过指针变量输出整型数组a的10个元素
- 求1+2+3+......+100.
- c++第1次上机实验(三角形的面积)
- C++引用和java引用的区别
- c++实现双向链表的常用功能