蓝桥杯 C++项目题库

2.1 ***选拔赛难度模拟题
2.1.1 圆的面积和周长
输入圆的半径 r(可能是小数),计算圆的面积和周长。
圆的面积=PI*r*r,圆的周长=2*PI*r
输出结果保留两位小数,PI=3.14
输入
1
输出
3.14 6.28
样例输入
1.9
样例输出
11.34 11.93
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
double r,pi=3.14;
cin>>r;
printf("%0.2f %0.2f",pi*r*r,2*pi*r);
return 0;
}
2.1.2 四方定理
“四方定理”是数论中著名的一个定理,指所有自然数至多只要用四个数的平方和
就可以表示。
输入 4 个自然数,输出这四个自然数的平方和
输入
7 7 7 8
输出
211
样例输入
3 4 5 7
样例输出
99
#include<iostream>
using namespace std;
int main(){
int a,b,c,d;
cin>>a>>b>>c>>d;
cout<<a*a+b*b+c*c+d*d;
return 0;
}
2.1.3 水仙花数
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital
invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),
水仙花数是指一个 3 位数,它的每个位上的数字的 3 次幂之和等于它本身(例如:
1
3 + 5
3+ 3
3 = 153)。
输入一个 3 位数判断是否是水仙花数
是则输出 yes,否则输出 no
输入 153
输出 yes
样例输入 219
样例输出 no
#include<iostream>
using namespace std;
int main(){
int a,b,c,n;
cin>>n;
a=n/100;
b=n/10%10;
c=n%10;
if(a*a*a+b*b*b+c*c*c==n)
cout<<"yes"<<endl;
else
cout<<"no";
return 0;
}
2.1.4 大小写转换
第一个整数 n,代表接下来有 n 个字符数据,如果是大写字符,需要把它转换成小写
字符并输出
如果是小写字符,需要把它转换成大写字符并输出,如果是数字,不做任何处理,直
接输出
输入
3 a F 9
输出
A
f
9
#include<iostream>
using namespace std;
int main(){
int n,i;
char a;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a; //大写 A 65 小写 a 97 ascii 码相差 32
if(a>='A'&&a<='Z' ) cout<<char(a+32)<<endl;
if(a>='a'&&a<='z' ) cout<<char(a-32)<<endl;
if(a>='0'&&a<='9' ) cout<<a<<endl;
}
return 0;
}
2.1.5 国庆节是星期几
1949 年的国庆节(10 月 1 日)是星期六,输入一个大于 1949 年的年份 n 输出 n 年
的 10 月 1 日是星期几
星期一 输出 1
星期二 输出 2
... 星期日 输出 0
输入
1950
样例输入
2019
样例输出
2
提示
计算 1949 年以后每年的天数(闰年 366 天,平年 365 天)
把天数求和然后加上 6(1949 年的国庆节是星期 6)
用这个数字对 7 求余数,就是结果
//整年计算,计算有多少天
#include<iostream>
using namespace std;
int main() {
int n, i, day = 0;
cin >> n;
for (i = 1949; i <= n; i++) {
//平年闰年判断
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
day = day + 366;
else
day = day + 365;
}
cout << (day-1 + 6) % 7; //减去加重 1 天,把天数求和然后加上 6
return 0; }
#include<iostream>
using namespace std;
int main() {
int n, i, day = 0,m=0;
cin >> n;
for (i = 1949; i <= n; i++) {
//平年闰年判断
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) m++; }
day=(n-1949)*365+m;
cout << (day+ 6) % 7;
return 0;
}
2.1.6 回文素数
输入一个五位数,判断是否是回文素数,回文素数的条件:
1.是一个素数
2.第一位和第五位相等,第二位和第四位相等
输入
30203
输出
yes
样例输入
10101
第 16 页 共 256 页
样例输出
no
#include<iostream>
using namespace std;
bool isprime(int n){
if(n<=1){
return 0;
}
for(int i=2;i*i<=n;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
}
int main()
{
int n,a,b,c,d;
cin>>n;
a=n%10;
b=n/10%10;
c=n/1000%10;
d=n/10000;
if(a==d&&b==c&&isprime(n))
cout<<"yes";
else
cout<<"no";
return 0;
}
2.1.7 数据加密
某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,
加密规则如下:每位数字都加上 5,然后除以 10 的余数代替该数字,再将第一位和第
四位交换,第二位和第三位交换。
第 17 页 共 256 页
输入一个四位数字,输出加密后的四位数字
输入
9876
输出
1234
样例输入
1234
样例输出
9876
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a,b,c,d;
cin>>n;
a=(n%10+5)%10;
b=(n/10%10+5)%10;
c=(n/1000%10+5)%10;
d=(n/10000+5)%10;
cout<<a<<b<<c<<d;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[4];
cin>>a;
for(int i=0;i<4;i++)
a[i]=(a[i]-48+5)%10+48 ;
for(int j=3;j>=0;j--)
cout<<a[j];
return 0;}
2.1.8 蜘蛛和蜻蜓(枚举)
蜘蛛有 8 条腿,蜻蜓有 6 条腿和 2 对翅,蝉有 6 条腿和 1 对翅。三种虫子共 18
只,共有 118 条腿和 20 对翅。问每种虫子各几只?
输出蜘蛛数量,蜻蜓数量,蝉的数量 多组数据,需换行
#include <bits/stdc++.h>
using namespace std;
int main()
{
第 18 页 共 256 页
int zz,qt,c;
for(zz=1;zz<=118/8;zz++)
{
for(qt=1;qt<=20/2;qt++)
{
c=18-zz-qt;
if(zz*8+qt*6+c*6==118&&qt*2+c==20)
{
printf("%d %d %d\n",zz,qt,c);
}
}
}
return 0;
}
2.1.9 求三位数
有一个三位数,个位数字比百位数字大,而百位数字又比十位数字大,并且各位
数字之和等于各位数字相乘之积,求此三位数
方法一:
#include<iostream>
using namespace std;
int main()
{
int n,Gw,Bw,Sw;
for(int n=100;n<=999;n++)
{
Gw=n%10;
Sw=n/10%10;
Bw=n/100%10;
if(Gw+Bw+Sw==Gw*Bw*Sw&&Gw>Bw&&Bw>Sw)
cout<<n<<endl;
}
return 0;
}
方法二:
#include<iostream>
using namespace std;
int main() {
int a,b,c,i;
for(c=1; c<=9; c++)
第 19 页 共 256 页
for(b=1; b<=9; b++)
for(a=1; a<=9; a++) {
if(a>c && c>b && a+b+c==a*b*c)
cout<<c*100+b*10+a<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{ int cnt=0;
for(int shi=0;shi<=9;shi++)
{
for(int bai=shi+1;bai<=9;bai++)
{
for(int ge=bai+1;ge<=9;ge++)
{
if( ge+shi+bai==ge*shi*bai)
{
cout << bai*100+shi*10+ge<<endl<<cnt;
}
cnt++;
}
}
}
return 0;
}
2.1.10鸡兔又同笼
有一群鸡和一群兔,它们的只数相同,它们的脚数都是三位数,且这两个三位数的数字分别是 0,
1,2,3,4,5。问鸡和兔的只数各是多少?它们的脚数各是多少?
输出
第一行输出鸡的数量,兔的数量
第二行输出鸡的腿数,兔的腿数
答案输出: 76 76
152 304
参考代码一:枚举法
#include<iostream>
using namespace std;
int a[10];
第 20 页 共 256 页
int main() {
int n, j, t;
for (n = 51; n <= 135; n++) { //兔子最少 102/2 最大 543/4
j = 2 * n;
t = 4 * n;
a[j % 10]++;
a[j / 10 % 10]++;
a[j / 100]++;
a[t % 10]++;
a[t / 10 % 10]++;
a[t / 100]++;
if (a[0] == 1 && a[1] == 1 && a[2] == 1 && a[3] == 1 && a[4] == 1 && a[5] == 1) {
cout << n << " " << n << endl;
cout << j << " " << t;
}
for (int i = 0; i <= 5; i++) {
a[i] = 0;
}
}
return 0;
}
第 21 页 共 256 页
2.1.11数列特征
输入:
第一行为整数 n,表示数的个数。
第二行有 n 个整数,为给定的 n 个数,每个数的绝对值都小于 10000。
输出:
第一行输出这些数中的最大值
第二行输出这些数中的最小值
第三行输出这些数的和
第四行输出平均值(保留两位小数)
第五行输出与平均值的差在 2(包含 2)以内的数据的数量
输入
3
1 2 3
输出
3
1
6
2.00
3
样例输入
5
9 7 8 3 4
样例输出
9
3
31
6.20
2
提示
printf("%.2f\n",avg);保留两位小数请使用 printf 输出
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
第 22 页 共 256 页
int main()
{
int i,n,cnt=0;
long long sum=0;
double avg;
cin>>n;
int a[n];
for(i=0;i<n;i++)
{
cin>>a[i];
sum=sum+a[i];
}
avg=sum*1.0/n;
sort(a,a+n);
for(i=0;i<n;i++)
{
if( abs(a[i]-avg)<=2) cnt++;
}
cout<<a[n-1]<<endl;
cout<<a[0]<<endl;
cout<<sum<<endl;
printf("%0.2lf\n",avg);
cout<<cnt<<endl;
return 0;
}
2.1.12插队问题
有 n 个人(每个人有一个唯一的编号,用 1~n 之间的整数表示)在一个水龙头
前排队准备接水,现在第 n 个人有特殊情况,经过协商,大家允许他插队到第 x 个
位置。输出第 n 个人插队后的排队情况。
输入格式
第一行 1 个正整数 n,表示有 n 个人,2<n≤100。
第二行包含 n 个正整数,之间用一个空格隔开,表示排在队伍中的第 1~ 第 n 个人
的编号。
第 23 页 共 256 页
第三行包含 1 个正整数 x,表示第 n 个人插队的位置,1≤x<n。
输出格式
一行包含 n 个正整数,之间用一个空格隔开,表示第 n 个人插队后的排队情况。
输入样例
7
7 2 3 4 5 6 1
3
输出样例
7 2 1 3 4 5 6
解析:这样的题目看文字比较模糊,直接看输入输出样例。
用数组存储数字,0 的位置空出。
插队后 x-1 之前位置数字不变,x 到 n-1 位置数字均向后窜一位,用 n 位置数字覆盖
x 位置数字。
方法一、更新数组 模拟算法
#include<iostream>
using namespace std;
int main() {
int a[105];
int x,n,i,temp;
cin>>n;
for(i=1; i<=n; i++) {
cin>>a[i]; //存储
}
temp=a[n]; //保留现场
cin>>x;
for(i=n; i>=x; i--) {
a[i]=a[i-1]; //从后面开始遍历挪位置
}
a[x]=temp;//n 覆盖 x
for(i=1; i<=n; i++) {
cout<<a[i]<<" "; //遍历输出
}
return 0;
}
方法二、拼接输出 数据量大时效率高
第 24 页 共 256 页
#include<iostream>
using namespace std;
int main() {
int a[105];
int x,n,i;
cin>>n;
for(i=1; i<=n; i++) {
cin>>a[i]; //存储
}
cin>>x;
for(i=1; i<x; i++)
cout<<a[i]<<" "; //遍历输出插队位置前数据
cout<<a[n]<<" "; //输出插队的数据
for(i=x; i<n; i++)
cout<<a[i]<<" "; //遍历输出插队位置后不包含 n 的数据
return 0;
}
2.1.13数字和
输入一个整数 n,求各个位上的数字和,最长 200 位
输入
123456789987654321123456789987654321
输出
180
样例输入
45676475645643535479097091092198721753297409443093983432
样例输出
268
注意题目说明 “ 最长 200 位”
先上一个最长 19 位 long long 数据类型能存下的解法,看一下解题思路。
#include <iostream>
using namespace std;
int main() {
long long n;
第 25 页 共 256 页
int sum = 0;
cin>>n;
while(n!=0) {
sum += n%10;
n = n/10;
}
cout<<sum<<endl;
return 0;
}
这种用 while 取数字的方法一定要掌握
#include <iostream>
#include <cstring>
using namespace std;
int main() {
string s; //用字符串存储超长的数字
int len,sum=0;
getline(cin, s);//接受一个字符串,可以接受空格并输出 代替 cin>>s
len=s.size();//计算 string 中的元素个数用 size()
for(int i=0; i<len; i++)
sum+=s[i]-'0';
//s 是字符数组,要它变成数字,需要减去一个字符 0,完成隐式转换
cout<<sum<<endl;
return 0;
}
2.1.14字符串比较
给定两个仅由大写字母或小写字母组成的字符串(长度介于 1 到 10 之间),它们之
间的关系是以下 4 种情况之一:
1:两个字符串长度不等。比如 Beijing 和 Hebei
2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比
如 Beijing 和 Beijing
3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达
到完全一致(也就是说,它并不满足情况 2)。比如 beijing 和 BEIjing
4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。
第 26 页 共 256 页
比如 Beijing 和 Nanjing
编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号
输入:
BEIjing
beiJing
输出:
3
输入
Beijing
Hebei
输出
1
样例输入
Beijing
Beijing
样例输出
2
#include<iostream>
#include<cstring>
using namespace std;
int main() {
string a, b;
int f = 0, c = 0, d = 0;
cin >> a >> b;
if (a.size() == b.size()) {
for (int i = 0; i < a.size(); i++) {
if (a[i] == b[i]) {
c++;
}
if (a[i] - 'A' + 'a' == b[i] || a[i] == b[i] - 'A' + 'a') {
d++;
}
}
if (c == a.size()) {
cout << 2;
} else if (c + d == a.size()) {
第 27 页 共 256 页
cout << 3;
} else {
cout << 4;
}
} else {
cout << 1;
}
return 0;
}
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main() {
string s1, s2;
int len1, len2;
getline(cin, s1);//接受一个字符串,可以接受空格并输出 代替 cin>>s
getline(cin, s2);
len1 = s1.size(); //计算 string 中的元素个数用 size()
len2 = s2.size();
if (len1 != len2) {
cout << "1";
} else {
for (int i = 0; i < len1; i++) {
if (s1[i] != s2[i]) {
if (toupper(s1[i]) != toupper(s2[i]) ){//不区分大小写
cout << "3";
return 0;
} else {
cout << "4";
return 0;
}
}
}
第 28 页 共 256 页
}
cout << "2";
return 0;
}
2.1.15奖券数目
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是
5 位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,
如果任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。
#include<iostream>
using namespace std;
int main()
{
int ans = 0;
for (int i = 10000; i <= 99999; i++)
{
int num = i;
int a = num % 10;
int b = num /10 % 10;
int c = num /100 % 10;
int d = num /1000 % 10;
int e = num /10000 % 10;
if(a==4||b==4||c==4||d==4||e==4)
{
}
else
ans++;
}
cout <<ans;
return 0;
}
方法 2
第 29 页 共 256 页
#include<iostream>
using namespace std;
int main()
{
int ans = 0;
int cnt = 90000;
for (int i = 10000; i <= 99999; i++)
{
int num = i;
int a = num % 10; num=num/10;
int b = num % 10; num=num/10;
int c = num % 10; num=num/10;
int d = num % 10; num=num/10;
int e = num % 10;
if(a==4||b==4||c==4||d==4||e==4)
{
cnt--;
}
else
ans++;
}
cout <<ans<<endl;
cout <<cnt<<endl;
return 0; }
2.1.16纪念日
2020 年 7 月 1 日是中国共产党成立 99 周年纪念日。中国共产党成立于 1921 年 7
月 23 日。请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含
多少分钟?
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include<iostream>
using namespace std;
int days(int n)
{
if(n%400==0||n%4==0&&n%100!=0)
return 366;
第 30 页 共 256 页
else
return 365;
}
int main()
{
int sum=0;
for(int i=1922; i<=2020; i++)
{
sum=sum+days(i);
}
sum=sum-22;
cout<<sum*60*24;
return 0;
}
2.2 ***第十届蓝桥杯青少组选拔赛 C++中级组(2019 年 12 月)
2.2.1 分段输出
输入一个正整数 N,如果 N 大于等于 90 输出 A,如果 N 大于等于 80 且小于 90
输出 B,如果 N 大于等于 70 且小于 90 输出 C,如果 N 小于 70 输出 D。
输入
70
输出
C
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
if(n>=90) cout <<"A";
if(n>=80&&<90) cout <<"B";
if(n>=70&&<90) cout <<"C";
if(n<70) cout <<"D";
}
第 31 页 共 256 页
return 0;
}
2.2.2 小球反弹高度
一个小球从 n 米高度自由落下,每次落地后反跳回原高度的一半,再落下。求第
10 次反弹多高,及初始落下到第 10 次反弹到最高点时(不含第十次落下距离)一共
经历了多少米?
输入描述:输入一个正整数 n
输出描述:
(1)第 10 次反弹高度 (2)一共经历了多少米(不含第十次落下距离)
输入
1024
输出
1 3069
#include<iostream>
using namespace std;
int main()
{
double n,i,sum=0;
cin>>n;
sum=n;
for(i=1;i<=10;i++)
{
sum=sum+n;
n=n/2;
}
cout<<n<<endl<<sum-n;
return 0;
}
2.2.3 求最大值、最小值和平均值
输入 10 个正整数,以空格分隔,输出其中的最大值、最小值以及平均值,以逗号
隔开
输入
1 2 3 4 5 6 7 8 9 10
输出
第 32 页 共 256 页
10,1,5.5
#include<iostream>
using namespace std;
int main()
{
int n,max,min,sum=0;
cin>>n;
max=min=n;
for(int i=2;i<=10;i++)
{
cin>>n;
if(n>max) max=n;
if(n<min) min=n;
sum=sum+n;
}
cout<<max<<","<<min<<","<<sum/10.0;
return 0;
}
2.2.4 回文数
输入 n,输出 1~n(包含 1 和 n)之间所有的回文数,并统计回文数的个数。个数
之前要加星号。
输入:
100
输出:
1
2
3
4
5
6
7
8
9
11
22
33
第 33 页 共 256 页
44
55
66
77
88
99
*18
#include<iostream> //逐位分离多位数
using namespace std;
int main() {
int i, n, count = 0, t, k = 10;
cin >> n;
for ( i = 1; i <= n; i++) {
t = i;
int m = 0;
while (t != 0) {
m = m * k + t % 10;
t = t / 10;
}
if (m == i) {
cout << m << endl;
count++;
}
}
cout << "*" << count;
return 0;
}
//转成字符串的方式判断
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, cnt = 0, len;
string s;
cin >> s;
len = s.size();
bool flag = 0;
第 34 页 共 256 页
for (int k = 0; k < len / 2; k++) {
if (s[k] != s[len - k - 1] ) {
flag = 1;
break;
}
}
cout << s << endl;
if (flag == 0) {
cout << "yes" << endl;
}
}
2.2.5 煤球数目
有一堆煤球,堆成三角棱锥形。具体:
第一层放 1 个,
第二层 3 个(排列成三角形),
第三层 6 个(排列成三角形),
第四层 10 个(排列成三角形),

如果一共有 100 层,共有多少个煤球?
请输出表示煤球总数目的数字。
注意:你输出的应该是一个整数,不要输出任何多余的内容或说明性文字。
输入
没有输入。
输出
输出一个整数,即 1~100 层煤球的总数。
解题思路:第一层 1
第二层 1+2=3
第三层 3+3=6
第四层 6+4=10 ……
第 i 行煤球的个数是在原有结果的基础上加上第 i 行的 i 的值
答案:171700
方法一、
#include<iostream>
第 35 页 共 256 页
using namespace std;
int main ()
{
int i,temp = 0;
long long sum = 0;
for(i=1;i<=100;i++)
{
temp=temp+i; //每层递增数量和层数相同
sum=sum+temp;
}
cout<<sum;
return 0;
}
方法二、观察发现第 n 层有(n*(n+1))/2 个煤球,只需要使用一个循环将每一层的
数量累加起来即可。
#include<iostream>
using namespace std;
int main ()
{
long long sum = 0;
for(int i=1;i<=100;i++)
sum=sum+(i*(i+1))/2; //第 n 层有(n*(n+1))/2 个煤球
cout<<sum;
return 0;
} //比较精简的代码
2.2.6 奖券数目
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这
些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是 5 位
数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果
任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。
int main() {
int ans = 0;
for (int i = 10000; i <= 99999; i++) {
int num = i;
第 36 页 共 256 页
int a = num % 10; num=num/10;
int b = num % 10; num=num/10;
int c = num % 10; num=num/10;
int d = num % 10; num=num/10;
int e = num % 10;
if(a==4||b==4||c==4||d==4||e==4)
{ }
else
ans++;
}
cout <<ans;
return 0; }

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值