2014年第五届蓝桥杯C/C++ C组决赛真题题解
2017-04-15 14:15
337 查看
1. 标题:国王的遗产
X国是个小国。国王K有6个儿子。在临终前,K国王立下遗嘱:国王的一批牛作为遗产要分给他的6个儿子。
其中,大儿子分1/4,二儿子1/5,三儿子1/6,....
直到小儿子分1/9。
牛是活的,不能把一头牛切开分。
最后还剩下11头牛,分给管家。
请计算国王这批遗产中一共有多少头牛。
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)
【分析】循环+枚举
【答案】2520
2. 标题:神奇6位数
有一个6位的正整数,它有个很神奇的性质:
分别用2 3 4 5 6去乘它,得到的仍然是6位数,并且乘积中所包含的数字与这个6位数完全一样!只不过是它们的顺序重新排列了而已。
请计算出这个6位数。
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)
【分析】循环+枚举+数位分离+数位判重(在不考虑复杂度要求的情况下,可以使用一般思路,即两重循环)
【答案】142857
3. 标题:日期差
历史上,不同的人类聚居地可能有不同的历法,因而记录下来的资料中日期的换算就很麻烦。幸好今天我们统一使用公元纪年法。当然,这种历法对求两个日期差多少天也不是十分简便,但毕竟是可以忍受的。
下面的程序计算了两个日期的差值,两个日期都使用公元纪年法。
请分析程序逻辑,并推断划线部分缺失的代码。
int to_day(int y, int m, int d)
{
int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = 0;
int i;
for(i=1; i<y; i++){
day += (i%4==0 && i%100!=0 || i%400==0)? 366 : 365;
}
if(y%4==0 && y%100!=0 || y%400==0) mon[2]++;
for(i=1; i<m; i++){
_____________________; //填空位置
}
return day + d;
}
int diff(int y1, int m1, int d1, int y2, int m2, int d2)
{
int a = to_day(y1, m1, d1);
int b = to_day(y2, m2, d2);
return b-a;
}
int main()
{
int n = diff(1864,12,31,1865,1,1);
printf("%d\n", n);
return 0;
}
注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)。
【分析】日期计算问题
此题使用的方法是计算 从公元1年1月1日到y2年m2月d2日的天数 - 从公元1年1月1日到y1年m1月d1日的天数,并返回结果
【答案】day+=mon[i]
4. 标题:拼接平方数
小明发现49很有趣,首先,它是个平方数。它可以拆分为4和9,拆分出来的部分也是平方数。169也有这个性质,我们权且称它们为:拼接平方数。
100可拆分1 00,这有点勉强,我们规定,0 00 000 等都不算平方数。
小明想:还有哪些数字是这样的呢?
你的任务出现了:找到某个区间的所有拼接平方数。
【输入格式】
两个正整数 a b (a<b<10^6)
【输出格式】
若干行,每行一个正整数。表示所有的区间[a,b]中的拼接平方数
例如:
输入:
1 200
程序应该输出:
49
169
再例如:
输入:
169 10000
程序应该输出:
169
361
1225
1444
1681
3249
4225
4900
9025
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
【分析】数学知识运用
这里的拼接平方数是完全平方数的一种特殊情况,要求求出的数本身是完全平方数,并且要求存在对数的一种划分,使得两部分都是完全平方数,且不为0。
X国是个小国。国王K有6个儿子。在临终前,K国王立下遗嘱:国王的一批牛作为遗产要分给他的6个儿子。
其中,大儿子分1/4,二儿子1/5,三儿子1/6,....
直到小儿子分1/9。
牛是活的,不能把一头牛切开分。
最后还剩下11头牛,分给管家。
请计算国王这批遗产中一共有多少头牛。
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)
【分析】循环+枚举
#include <stdio.h> int main() { int i; //i记录遗产中牛的总数 int num; //num记录分完以后的牛数 for(i=10;;i++) { if(i%4==0 && i%5==0 && i%6==0 && i%7==0 && i%8==0 && i%9==0) //必须能够平分 { num=i; num-=(i/4+i/5+i/6+i/7+i/8+i/9); if(num==11) //且最后剩下的牛的数量为11 { printf("%d\n",i); break; } } } return 0; }
【答案】2520
2. 标题:神奇6位数
有一个6位的正整数,它有个很神奇的性质:
分别用2 3 4 5 6去乘它,得到的仍然是6位数,并且乘积中所包含的数字与这个6位数完全一样!只不过是它们的顺序重新排列了而已。
请计算出这个6位数。
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)
【分析】循环+枚举+数位分离+数位判重(在不考虑复杂度要求的情况下,可以使用一般思路,即两重循环)
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int Seperatenum(int *a,int n) //分离n的各位数并返回其位数 { int i=0,num=n; while(num) { a[i++]=num%10; num/=10; } return i; } int Judge(int *a,int *b) //判断a b两数组中的数是否完全一致 { int i,j; int flag=1; sort(a,a+6); //将a b两数组中的数递增排序 sort(b,b+6); for(i=0;i<6;i++) //6个数对应判断是否相等,发现不相等立即退出,返回0 { if(a[i]!=b[i]) { flag=0; break; } } return flag; } int main() { int i,j; int num,n1,n2,n3,n4,n5; int a[10],b[10],c[10],d[10],e[10],f[10]; for(i=100000;i<1000000;i++) { num=i; Seperatenum(a,num); n1=i*2; n2=i*3; n3=i*4; n4=i*5; n5=i*6; if(Seperatenum(b,n1)==6 && Seperatenum(c,n2)==6 && Seperatenum(d,n3)==6 && Seperatenum(e,n4)==6 && Seperatenum(f,n5)==6) //判断处理后的数是否仍为6位 { if(Judge(a,b) && Judge(a,c) && Judge(a,d) && Judge(a,e) && Judge(a,f)) //判断处理后的5个数的各位数是否与i相同 { printf("i=%d\n",i); printf("i*2=%d\n",i*2); printf("i*3=%d\n",i*3); printf("i*4=%d\n",i*4); printf("i*5=%d\n",i*5); printf("i*6=%d\n",i*6); } } } return 0; }
【答案】142857
3. 标题:日期差
历史上,不同的人类聚居地可能有不同的历法,因而记录下来的资料中日期的换算就很麻烦。幸好今天我们统一使用公元纪年法。当然,这种历法对求两个日期差多少天也不是十分简便,但毕竟是可以忍受的。
下面的程序计算了两个日期的差值,两个日期都使用公元纪年法。
请分析程序逻辑,并推断划线部分缺失的代码。
int to_day(int y, int m, int d)
{
int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = 0;
int i;
for(i=1; i<y; i++){
day += (i%4==0 && i%100!=0 || i%400==0)? 366 : 365;
}
if(y%4==0 && y%100!=0 || y%400==0) mon[2]++;
for(i=1; i<m; i++){
_____________________; //填空位置
}
return day + d;
}
int diff(int y1, int m1, int d1, int y2, int m2, int d2)
{
int a = to_day(y1, m1, d1);
int b = to_day(y2, m2, d2);
return b-a;
}
int main()
{
int n = diff(1864,12,31,1865,1,1);
printf("%d\n", n);
return 0;
}
注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)。
【分析】日期计算问题
此题使用的方法是计算 从公元1年1月1日到y2年m2月d2日的天数 - 从公元1年1月1日到y1年m1月d1日的天数,并返回结果
#include <stdio.h> int to_day(int y, int m, int d) { int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int day = 0; int i; for(i=1; i<y; i++) { day += (i%4==0 && i%100!=0 || i%400==0)? 366 : 365; } if(y%4==0 && y%100!=0 || y%400==0) mon[2]++; for(i=1; i<m; i++) { day+=mon[i]; //填空位置 } return day + d; } int diff(int y1, int m1, int d1, int y2, int m2, int d2) { int a = to_day(y1, m1, d1); int b = to_day(y2, m2, d2); return b-a; } int main() { int n = diff(1864,12,31,1865,1,1); //int n=diff(2016,9,20,2017,4,13); //补充测试用例 printf("%d\n", n); return 0; }
【答案】day+=mon[i]
4. 标题:拼接平方数
小明发现49很有趣,首先,它是个平方数。它可以拆分为4和9,拆分出来的部分也是平方数。169也有这个性质,我们权且称它们为:拼接平方数。
100可拆分1 00,这有点勉强,我们规定,0 00 000 等都不算平方数。
小明想:还有哪些数字是这样的呢?
你的任务出现了:找到某个区间的所有拼接平方数。
【输入格式】
两个正整数 a b (a<b<10^6)
【输出格式】
若干行,每行一个正整数。表示所有的区间[a,b]中的拼接平方数
例如:
输入:
1 200
程序应该输出:
49
169
再例如:
输入:
169 10000
程序应该输出:
169
361
1225
1444
1681
3249
4225
4900
9025
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
【分析】数学知识运用
这里的拼接平方数是完全平方数的一种特殊情况,要求求出的数本身是完全平方数,并且要求存在对数的一种划分,使得两部分都是完全平方数,且不为0。
#include <stdio.h> #include <math.h> int getDigit(int n) //求一个正整数n的位数 { int num=n; int digit=0; while(num) { digit++; num/=10; } return digit; } int is_pownum(int n) //判断正整数n是否是完全平方数 { int temp; temp=sqrt(n); if(temp*temp==n) return 1; else return 0; } int main() { int a,b; int i,j,k; int n,n1,n2,suc; //n1.n2-数n的两部分 n-拼接后的数 suc-拼接平方数判断标记 scanf("%d %d",&a,&b); for(i=a;i<=b;i++) { if(!is_pownum(i)) //如果区间[a,b]内的某个数i不是完全平方数,直接返回,不再判断 continue; suc=0; //是完全平方数,置标记suc=0 for(j=1;j<getDigit(i);j++) //求n1与n2 { n=i; n1=0,n2=0; for(k=1;k<=j;k++) //n1最少1位,最多getDigit(i)位,并且要含上可能出现的0 { n1+=((n%10)*pow(10,k-1)); n/=10; } n2=(i-n1)/pow(10,j); //n2=n1未包含的数位对应的数字 if(is_pownum(n1) && is_pownum(n2) && n1!=0 && n2!=0) //n1 n2均为完全平方数且均不为0(排除0 00 000等情况) { suc=1; //置标记suc=1,说明找到符合条件的拼接平方数,并退出所有循环 break; } } if(suc) printf("%d\n",i); } return 0; }
相关文章推荐
- 2014年第五届蓝桥杯C/C++ B组决赛真题题解
- 2014年第五届蓝桥杯C/C++组真题补充训练(一,未完待续,2017.3.6)
- 2014年第五届蓝桥杯C/C++B组真题训练(一,未完待续,2017.3.5)
- 第五届蓝桥杯软件类决赛真题-C-A-1_海盗分金币
- 第五届蓝桥杯软件大赛C/C++本科B组决赛解题报告
- 蓝桥杯C++B组历届决赛真题
- 2014年第五届蓝桥杯试题C/C++程序设计B组——奇怪的分式
- 2014年第五届蓝桥杯试题C/C++程序设计B组——史丰收速算
- 第五届蓝桥杯C/C++本科B组(真题试做)(1~5)
- 算法笔记_205:第五届蓝桥杯软件类决赛真题(C语言B组)
- 第五届蓝桥杯C/C++本科B组(真题试做)(9~10)
- 2014年第五届蓝桥杯试题(C/C++本科B组)
- 第五届蓝桥杯C++本科B组省赛真题详解
- 2013年第四届蓝桥杯C/C++ C组决赛真题题解
- 算法笔记_206:第五届蓝桥杯软件类决赛真题(Java语言A组)
- 第五届蓝桥杯决赛C\C++B组——生物芯片
- 2014年第五届蓝桥杯决赛C组题目 第一题 标题:国王的遗产
- 2014年第五届蓝桥杯决赛C组题目 第三题 标题:日期差
- 2014年第五届蓝桥杯试题C/C++程序设计B组——打印图像
- 2014年第五届蓝桥杯试题C/C++程序设计B组——李白打酒