蓝桥杯练习系统 基础练习 全部习题ac代码
BASIC-1 闰年判断
问题描述
给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年:
年份是4的倍数而不是100的倍数;
年份是400的倍数。
其他的年份都不是闰年。
输入格式
输入包含一个整数y,表示当前的年份。
输出格式
输出一行,如果给定的年份是闰年,则输出yes,否则输出no。
说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。
样例输入
2013
样例输出
no
样例输入
2016
样例输出
yes
数据规模与约定
1990 <= y <= 2050。
注意闰年的判断条件
#include "iostream" #include "stdio.h" #include "stdlib.h" using namespace std; int main() { bool a; a = false; int n; cin >> n; if (n % 4==0) { if (n % 400 != 0) a = true; } if (n % 400 == 0) a = true; if (a) cout << "yes" << endl; else cout << "no" << endl; return 0; }
BASIC-2 01字串
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>
把十进制的数从0开始转化为二进制输出即可,注意补足前导0;
#include <iostream> using namespace std; int main() { for(int i=0; i<32; ++i) { int a[5] ={0}; int temp = i; int index = 4; while (temp >= 1) { a[index--] = temp % 2; temp = temp/2; } for (int idx = 0; idx < 5; ++idx) { cout << a[idx]; } cout << endl; } return 0; }
BASIC-4 数列特征
问题描述
给出n个数,找出这n个数的最大值,最小值,和。
输入格式
第一行为整数n,表示数的个数。
第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
输出格式
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。
样例输入
5
1 3 -2 4 5
样例输出
5
-2
11
数据规模与约定
1 <= n <= 10000。
一些对数组的处理
#include<bits/stdc++.h> using namespace std; int main() { int n,sum=0,MIN = 10000,MAX = -10000; int s[10000]; cin >> n; while(n--) { cin >> s[n]; sum += s[n]; MIN = min(MIN,s[n]); MAX = max(MAX,s[n]); } cout << MAX << endl; cout << MIN << endl; cout << sum << endl; return 0; }
BASIC-5 查找整数
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
输入格式
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。
遍历查找即可
#include<bits/stdc++.h> using namespace std; int main() { int n,t,a; cin >> n; t=n; int str[n+1]; while(t--) cin >> str[n-t]; cin >> a; for(int i=0;i<=n;i++) { if(str[i]==a) { cout << i << endl; t=-99; break; } } if(t!=-99) cout << -1 << endl; return 0; }
BASIC-6 杨辉三角形
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
用一个数组来储存杨辉三角,注意是哪两个数相加即可。
#include<cstdio> int main() { int a[100][100],i,j,num; scanf("%d",&num); for(i=0;i<100;i++) { for(j=0;j<100;j++) a[i][j]=0; } for(i=0;i<num;i++) a[i][0]=1; for(i=1;i<num;i++) for(j=1;j<=i;j++) a[i][j]=a[i-1][j]+a[i-1][j-1]; for(i=0;i<num;i++) { for(j=0;j<=i;j++) printf("%d ",a[i][j]); printf("\n"); } return 0; }
BASIC-7 特殊的数字
问题描述
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=111+555+333。编程求所有满足这种条件的三位十进制数。
输出格式
按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
遍历+判断
#include<bits/stdc++.h> using namespace std; int main() { for(int i=100;i<1000;i++) { if((i%10)*(i%10)*(i%10)+((i/10)%10)*((i/10)%10)*((i/10)%10)+((i/100)%10)*((i/100)%10)*((i/100)%10)==i) cout << i << endl; } return 0; }
BASIC-8 回文数
问题描述
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
按从小到大的顺序输出满足条件的四位十进制数。
只要把12正序和倒叙21各输出一次即可
#include<bits/stdc++.h> using namespace std; int main() { for(int i=10;i<100;i++) cout << i << i%10 << (i/10)%10 << endl; return 0; }
BASIC-9 特殊回文数
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
暴力算法
#include<iostream> #include<algorithm> using namespace std; int ans[1000005]; int main() { int n,now,t=0; cin>>n; if(n%2==0)//只有偶数才有6位十进制数的可能 { now=n/2; for(int i=9;i>=1;i--)//第一位不能为0 { if(now-i>=0) { for(int j=9;j>=0;j--) { if(now-i-j>=0) { for(int k=9;k>=0;k--) { if(i+j+k==now) { ans[t++]=i*100000+j*10000+k*1000+k*100+j*10+i; } } } } } } } //五位数的情况 int l; if(n%2==0) { l=8; } else l=9; for(int i=l;i>=0;i=i-2)//先考虑最中间位数的情况,如果n是偶数,则最中间的一定是偶数,如果n是奇数,则中间位为奇数 { if(n-i>=0) { now=(n-i)/2; for(int j=9;j>=1;j--)//首位不为0 { if(now-j>=0) { for(int k=9;k>=0;k--) { if(j+k==now) ans[t++]=j*10000+k*1000+i*100+k*10+j; } } } } } sort(ans,ans+t); for(int i=0;i<t;i++) { cout<<ans[i]<<endl; } return 0; }
BASIC-10 十进制转十六进制
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
与十进制转二进制类似,模上16再判断。
#include<iostream> #include<string> using namespace std; int main() { int a; cin >> a; char b[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; int c[10]; int k = 0; while (a >= 16) { c[k++] = a % 16; a = a / 16; } c[k] = a; //上面试整形数组来存转换为16进制的每个整形数 for (int j = k; j >= 0; j--)//注意这两层循环不能反过来 { for (int i = 0; i < 16; i++) { if (c[j] == i) { cout << b[i]; } } } return 0; }