蓝桥杯C/C++程序设计 往届真题汇总(基础篇)

文章目录

    • 1. REPEAT程序
    • 2. 猜生日
    • 3. 成绩统计
    • 4. 乘积尾零
    • 5. 等差数列
    • 6. 合并检测
    • 7. 回文日期
    • 8. 纪念日
    • 9. 既约分数
    • 10. 门牌制作
    • 11. 年号字符
    • 12. 跑步锻炼
    • 13. 跑步训练
    • 14. 平方和
    • 15. 七段数码管
    • 16. 奇数倍数
    • 17. 删除字符
    • 18. 蛇形填数
    • 19. 数的分解
    • 20. 数列求值
    • 21. 特别数的和
    • 22. 完全二叉树的权值
    • 23. 整数序列
    • 24. 质数
    • 25. 走方格
    • 26. 排列字母
    • 27. 日期问题
    • 28. 饮料换购
    • 29. 受伤的皇后
    • 30. 最大降雨量
    • 31. 单词分析
    • 32. 卡片
    • 33. 空间
    • 34. 时间显示
    • 35. 分巧克力

1. REPEAT程序

题目描述:
附件 prog.txt 中是一个用某种语言写的程序。
其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。
例如如下片段:

REPEAT 2;
	A=A+4;
		REPEAT 5;
		REPEAT 6;
			A=A+5;
		A=A+7;
	A=A+8;
A=A+9;

该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。
A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。
请问该程序执行完毕之后,A 的值是多少?

题目分析:
从题目中看出REPEAT就是一个for循环,后面的数字就是循环次数,循环控制的范围由缩进表达。然后模拟出题就可以

#include<iostream>
using namespace std;

int main(){
	int A=0;
	
	for(int i=0;i<2;i++){
		A+=4;
		for(int j=0;j<5;j++){
			for(int k=0;k<6;k++){
				A+=5;
			}
			A+=7;
		}
		A+=8;		
	}
	A+=9;
	
	cout<<"A = "<<A<<endl;
}

2. 猜生日

题目描述:
今年的植树节(2012年3月 12日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!” “把我出生的年月日连起来拼成一个8位数(月、日不足两位前补0)正好可以被今天的年、月、日整除!”
他想了想,又补充到:“再给个提示,我是6月出生的。”根据这些信息,请你帮小明算一下,他叔叔的出生年月日。
格式是年月日连成的8位数。例如,如果是1948年6月12日,就写:19480612。

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  for(int i=19000101;i<=20120312;i++){
    if(i%2012==0&&i%3==0&&i%12==0&&i/100%100==6&&i%100<32){
      cout<<i;
      break;
    }
  }
  return 0;
}

3. 成绩统计

题目描述:
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。

【输入格式】 输入的第一行包含一个整数n,表示考试人数。接下来n行,每行包含一个0至100的整数,表示一个学生的得分。
【输出格式】 输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。

#include<iostream>
using namespace std;

int main(){
	int n,bad=0,good=0,b,f;
	cin>>n;
	int a[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
		if(a[i]>=85){
			good++;	
		}
		if(a[i]>=60){
			bad++;
		}
		
	}
	b=bad*100.0/n*1.0+0.5;
	f=good*100.0/n*1.0+0.5;
	cout<<b<<"%"<<endl;
	cout<<f<<"%"<<endl;
}

4. 乘积尾零

题目描述:
如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?

5650 4542 3554 473  946  4114 3871 9073 90   4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
1486 5722 3135 1170 4014 5510 5120 729  2880 9019 
2049 698  4582 4346 4427 646  9742 7340 1230 7683 
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
6701 6645 1671 5978 2704 9926 295  3125 3878 6785 
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
689 5510 8243 6114  337  4096 8199 7313 3685 211 
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int a[100]={5650,4542,3554,473,946,4114,3871,9073,90,4329,2758,7949,6113,5659,5245,7432,3051,4434,6704,3594,9937,1173,6866,3397,4759,7557,3070,2287,1453,9899,1486,5722,3135,1170,4014,5510,5120,729,2880,9019,2049,698,4582,4346,4427,646,9742,7340,1230,7683,5693,7015,6887,7381,4172,4341,2909,2027,7355,5649,6701,6645,1671,5978,2704,9926,295,3125,3878,6785,2066,4247,4800,1578,6652,4616,1113,6205,3264,2915,3966,5291,2904,1285,2193,1428,2265,8730,9436,7074,689,5510,8243,6114,337,4096,8199,7313,3685,211};
  int cnt2=0,cnt5=0;
  for(int i=0;i<=99;i++){
    int t=a[i];
    while(t%2==0){
      cnt2++;
      t/=2;
    }
    while(t%5==0){
      cnt5++;
      t/=5;
    }
  }
  cout<<min(cnt2,cnt5)<<endl;
  return 0;
}

5. 等差数列

题目描述:
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给出这N个整数,小明想知道包含这N个整数的最短的等差数列有几项?

【输入描述】
输入的第一行包含一个整数 N。第二行包含N个整数A1,A2…An 。(注意并不一定是按等差数列中的顺序给出)
输出一个整数表示答案。

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n,min=10000;
  cin>>n;
  long long a[n];
  for(int i=0;i<n;i++){
    cin>>a[i];
  }
  sort(a,a+n);
  for(int j=0;j<n-1;j++){
    if(a[j+1]-a[j]<min){
        min=a[j+1]-a[j];
    }
  }
  int m=(a[n-1]-a[0])/min;
  if(min==0) cout<<n;
  else cout<<m+1;
  return 0;
}

6. 合并检测

题目描述:
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情, A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人( k 个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k?1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k+1 个试剂盒完成了 k 个人的检测。

A 国估计被测的民众的感染率大概是 1,呈均匀分布。请问 k 取多少能最节省试剂盒?

题目分析:
这里概率为1,我们不妨设置测试人员为100,然后就是分类讨论k可以被100整除和不可以被整除的情况
可以被100整除 100/k+k
不可以被100整除 100/k+k+1

#include<iostream>
using namespace std;

int main(){
	int k,sum,j,s=1000,min,m,f;
	for(k=1;k<=100;k++){
		if(100%k==0){
			j=100/k;
			sum=j+k;
			if(sum<s){
				min=sum;
				s=sum;
				f=k;
			}
		}
		else{
			j=100/k;
			sum=j+1+k;
			if(sum<s){
				min=sum;
				s=sum;
				f=k;
			}
		}
	}
	cout<<"最少需要试剂 "<<min<<" 盒,此时以 "<<f<<" 人为一个采集标本";
}

7. 回文日期

题目描述:
2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd”的格式写成一个8位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202即2021年12月2日。也有人表示20200202并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100年后就能遇到下一个ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。

【输入格式】
输入包含一个八位整数N,表示日期。

【输出格式】
输出两行,每行1个八位数。第一行表示下一个回文日期,第二行表示下一个ABABBABA型的回文日期。

#include<iostream>
using namespace std;

int leap(int year){
	if((year%4==0&&year%100!=0)||year%400==0) return 1;
}

int palindromic(int num){
	int m,m1,m2,m3,m4,m5,m6,m7,m8;
	m1=(num%10)*10000000;
	m2=(num/10%10)*1000000;
	m3=(num/100%10)*100000;
	m4=(num/1000%10)*10000;
	m5=(num/10000%10)*1000;
	m6=(num/100000%10)*100;
	m7=(num/1000000%10)*10;
	m8=num/10000000;
	m=m1+m2+m3+m4+m5+m6+m7+m8;
	if(num==m) return 1;
	else return 0;
}

int main(){
	
	int monthes[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int year,month,day,n,year0,month0,day0,n1,n2,n3,n4,n5,n6,n7,n8,m,m1,m2,m3,m4,m5,m6,m7,m8,k1,k2,k3,k4,k5,k6,k7,k8;
	int num;
	cin>>num; 
	if(!palindromic(num)) return 0;
	n1=(num/10000000)*1000;
	n2=(num/1000000%10)*100;
	n3=(num/100000%10)*10;
	n4=(num/10000%10);
	n5=(num/1000%10)*10;
	n6=(num/100%10);
	n7=(num/10%10)*10;
	n8=(num%10);
	year0=n1+n2+n3+n4;
	month0=n5+n6;
	day0=n7+n8;
		
	for(year=year0;year<10000;year++){
		if(leap(year)==1) monthes[2]=29;
		else monthes[2]=28;
		for(month=month0;month<13;month++){
			for(day=day0+1;day<monthes[month];day++){
				n=year*10000+month*100+day;
				m1=(day%10)*10000000;
				m2=(day/10)*1000000;
				m3=(month%10)*100000;
				m4=(month/10)*10000;
				m5=(year%10)*1000;
				m6=(year/10%10)*100;
				m7=(year/100%10)*10;
				m8=year/1000;
				k1=(day%10);
				k2=(day/10);
				k3=(month%10);
				k4=(month/10);
				k5=(year%10);
				k6=(year/10%10);
				k7=(year/100%10);
				k8=year/1000;
				m=m1+m2+m3+m4+m5+m6+m7+m8;
				if((n==m)&&(k8==k1)&&(k6==k1)&&(k3==k1)&&(k7==k2)&&(k5==k2)&&(k4==k2)) {
					cout<<n<<endl;	
					return 0;
				}
				
			}
		}
	}
}

8. 纪念日

题目描述:
2020 年 7 月 1 日是中国 共 产 党 成立 99 周年纪念日。
中国 共 产 党 成立于 1921 年 7 月 23 日。
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?

题目分析:
先计算1922年到2020 年一共多少天,然后减去多余的天数

#include<iostream>
using namespace std;

int main(){
	int i,j,flag,sum=0;
	
	for(i=1922;i<=2020;i++){
		if((i%4==0&&i%100!=0) || i%400==0) {
			sum+=366;
		}
		else sum+=365;
	}
	sum-=22;
	cout<<sum*24*60;
}

9. 既约分数

题目描述:
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4,5/2,1/8,7/1都是既约分数。
请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)

题目分析:
暴力搜索,通过最大公约数判断

#include<iostream>
using namespace std;

int panduan(int a,int b)
{
	int c;
	if(a==1&&b==1) return 1;
	if(a>=b){
		while(c=a%b){
			a=b;
			b=c;
		}
		if(b==1) return 1;
		else return 0;
	}
	else{
		while(c=b%a){
			b=a;
			a=c;
		}
		if(a==1) return 1;
		else return 0;
	}	
}
int main(){
	int sum=0;
	for(int i=1;i<=2020;i++){
		for(int j=1;j<=2020;j++){
			sum+=panduan(i,j);
		}
	}
	cout<<sum<<endl;
	cout<<panduan(2,21);
} 

10. 门牌制作

题目描述:
小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。
请问要制作所有的1到2020号门牌,总共需要多少个字符2?

#include<iostream>
using namespace std;

int panduan(int num){
	int sum=0;
	while(num){
		if(num%10==2){
			sum++;
		}
		num=num/10;
	}
	return sum;
}

int main(){
	int n;
	for(int i=0;i<=2020;i++){
		n+=panduan(i);
	}
	cout<<n;
} 

11. 年号字符

题目描述:
小明用字母 A对应数字 1,B对应 2,以此类推,用 Z对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA对应27,AB对
应28,AZ对应52,LQ对应329。请问2019对应的字符串是什么?

题目分析:
这题就是类似于一个进制转换,你可以回想一下十进制转二进制如何转换,然后再想想将十进制转化成26进制,口诀就是除p取余

#include<iostream>
#include<stack>
using namespace std;

int main(){
	int n=2019;
	stack<int> s;
	int temp;
	while(n){
		temp=n%26;
		s.push(temp);
		n/=26;
	}
	while(!s.empty()){
		char c=s.top()+64;
		cout<<c;
		s.pop();
	}
}

12. 跑步锻炼

题目描述:
小蓝每天都锻炼身体。正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。
如果同时是周一或月初,小蓝也是跑2千米。小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。
请问这段时间小蓝总共跑步多少千米?

题目分析:
首先算出总的天数,和月份数,然后求出一共有多少个周一,和周一中为月份的天数最后总天数+周一天数+月初天数 – 周一和月初重合天数

#include<iostream>
using namespace std;

int panduan(int a){
	if((a%4==0&&a%100!=0)||a%400==0)  return 1;
	else return 0;
}

int main(){
	int sum=0;
	int monthes[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int mon=6;  //星期几 
	for(int year=2000;year<=2020;year++){
		if(panduan(year)) monthes[2]=29;
		else monthes[2]=28;
		for(int month=1;month<=12;month++){
			for(int day=1;day<=monthes[month];day++){
				if(mon==8) mon=1;
				
				if(mon==1&&day==1){
					sum+=2;
				}
				else if(mon==1||day==1){
					sum+=2;
				}
				else sum+=1;
				
				if(year==2020&&month==10&&day==1) {
					cout<<sum;
					return 0;
				}
				mon++;				
			}
			
		}
		
	}
}

13. 跑步训练

题目描述:
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000 。如果小明跑步,每分钟损耗 600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0 ,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。答案中只填写数,不填写单位。

题目分析:
首先求出每秒的损耗,之后模拟跑步休息的锻炼过程就可以

#include<iostream>
using namespace std;

int main(){
	int sum=0;
	int N=10000;
	while(N>0){
		N-=600;
		sum+=60;
		N+=300;
		sum+=60;
		if(N<=600)
		{
			sum+=(N/10);
			break;
		}
	}	
	cout<<sum;
}

14. 平方和

题目描述:
小明对数位中含有2、0、1、9的数字很感兴趣,在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574,平方和是14362,注意,平方和是指将每个数分别平方后求和。请问,在1到2019中,所有这样的数的平方和是多少?

#include <iostream>
#include <string>
using namespace std;
int main()
{
  // 请在此输入您的代码
  long long sum=0;
  for(int i=1;i<=2019;i++){
    string str=to_string(i);
    if(str.find("2")==-1&&str.find("0")==-1&&str.find("1")==-1&&str.find("9")==-1) continue;
    else sum+=i*i;
  }
  cout<<sum;
  return 0;
}

15. 七段数码管

题目描述:
小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b,c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。

思路:
暴力,最后减去三种特殊情况(暴力判断不了的情况) 1101100 1011010 0110110

#include<iostream>
using namespace std;

int main()
{
    int sum=0;
    for(int a=0; a<=1; a++)
    {
        for(int b=0; b<=1; b++)
        {
            for(int c=0; c<=1; c++)
            {
                for(int d=0; d<=1; d++)
                {
                    for(int e=0; e<=1; e++)
                    {
                        for(int f=0; f<=1; f++)
                        {
                            for(int g=0; g<=1; g++)
                            {
                                int s=a+b+c+d+e+f+g;
                                if(s==1)
                                {
                                    sum++;
                                }
                                else if(s>=2)
                                {
                                    if(a==1&&b==0&&f==0)
                                        continue;
                                    else if(b==1&&a==0&&c==0&&g==0)
                                        continue;
                                    else if(c==1&&b==0&&g==0&&d==0)
                                        continue;
                                    else if(d==1&&e==0&&c==0)
                                        continue;
                                    else if(e==1&&d==0&&g==0&&f==0)
                                        continue;
                                    else if(f==1&&a==0&&e==0&&g==0)
                                        continue;
                                    sum++;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%d\n",sum-3);
    return 0;
}

16. 奇数倍数

题目描述:
请你找到最小的整数X 同时满足:X是2019的整倍数;X的每一位数字都是奇数。

#include <iostream>
using namespace std;

int main()
{
  // 请在此输入您的代码
  int n1,n2,n3,n4,n5,n6;
  for(int i=2019;;i++){
        n1=i%10;
        n2=i/10%10;
        n3=i/100%10;
        n4=i/1000%10;
        n5=i/10000%10;
        n6=i/100000%10;
        if(i%2019==0&&n1%2==1&&n2%2==1&&n3%2==1&&n4%2==1&&n5%2==1&&n6%2==1){
          cout<<i;
          return 0;
        }
    }
  return 0;
}

17. 删除字符

题目描述:
给定一个单词,请问在单词中删除t个字母后,能得到的字典序最小的单词是什么?

【输入描述】
输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 t。其中,单词长度不超过100,t小于单词长度。
【输出描述】
输出一个单词,表示答案。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  // 请在此输入您的代码
  string str;
  int n;
  cin>>str;
  cin>>n;
  int f=str.length()-1;
  while(n--){
    for(int i=0;i<str.length()-1;i++){
      if(str[i]>str[i+1]){
        f=i;
        break;
      }
    }
    str[f]='0';
  }

  for(int j=0;j<str.length();j++){
    if(str[j]!='0') cout<<str[j];
  }
  return 0;
}

18. 蛇形填数

题目描述:
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?
1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …

题目分析:
可以将图形顺时针旋转45度,我们可以发现20行20列应该位于第49层的中间一个,然后模拟就可以算出来了

1行1列	       1
	  	      3 2               +4      
2行2列	     4 5 6
	        10 9 8 7            +8
3行3列	  11 12 13 14 15
        16 17 18 19 20 21       +12 
4行4列 22 23 24 25 26 27 28
#include<iostream>
using namespace std;

int main(){
	int m=1;
	for(int i=0;i<20;i++){
		m+=4*i;
	}
	cout<<m;
}

19. 数的分解

题目描述:
把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包
含数字2和4,一共有多少种不同的分解方法?
注意交换 3个整数的顺序被视为同一种方法,例如 1000+1001+18和
1001+1000+18被视为同一种。

#include <iostream>
using namespace std;

bool check(int n){
  for(int i=0;n!=0;i++){
    if(n%10==2||n%10==4) return false;
    else n/=10;
  }
  return true;
}

int main()
{
  int num=0;
  for(int num1=1;num1<=2019/3;num1++){
    if(check(num1)){
      for(int num2=num1+1;num2<=(2019-num1)/2;num2++){
        if(check(num2)){
          int num3=2019-num1-num2;
          if(check(num3)&&num3>num2) num++;
        }
      }
    }
  }
  cout<<num;
  return 0;
}

20. 数列求值

题目描述:
给定数列1,1,1,3,5,9,17,…,从第4项开始,每项都是前3项的和。求
第20190324项的最后4位数字。

题目分析:
应为保留最后四位数字,所以每次计算过后需要用10000取余,不然会溢出

#include<iostream>
using namespace std;

int main(){
	int n0=0,n1=1,n2=1,n3=1,n=3;
	long long int s=0;
	while(n){
		s=n1+n2+n3;
		s%=10000;
		n1=n2;
		n2=n3;
		n3=s;
		
		n++;
		if(n==20190324) break;
	}	
	cout<<s;
}

21. 特别数的和

题目描述:
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0) ,在 1 到40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。请问,在 1 到 n 中,所有这样的数的和是多少?

【输入格式】
输入一行包含两个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。

#include<iostream>
using namespace std;

int main(){
	int n0,n1,n2,n3,n4,sum=0,num=0,N,Num=0;
	cin>>N;
	n0=N;
	while(n0){
		Num++;
		n0/=10;
	}
	//cout<<Num<<endl;
	for(int i=1;i<=N;i++){
		if(Num==4){
			if(i<10){
				n1=i%10;
				if(n1==0||n1==1||n1==2||n1==9){
					sum+=i; 
					num++;
				}
			}else if(i>=10&&i<100){
				n1=i/10%10;
				n2=i%10;
				if((n1==0||n1==1||n1==2||n1==9)||(n2==0||n2==1||n2==2||n2==9)){
					sum+=i; 
					num++;
				}
			}else if(i>=100&&i<1000){
				n1=i/100%10;
				n2=i/10%10;
				n3=i%10;
				if((n1==2||n1==0||n1==1||n1==9)||(n2==2||n2==0||n2==1||n2==9)||(n3==2||n3==0||n3==1||n3==9)){
					sum+=i; 
					num++;
				}
			}else {
				n1=i/1000%10;
				n2=i/100%10;
				n3=i/10%10;
				n4=i%10;
				if((n1==2||n1==0||n1==1||n1==9)||(n2==2||n2==0||n2==1||n2==9)||(n3==2||n3==0||n3==1||n3==9)||(n4==2||n4==0||n4==1||n4==9)){
					sum+=i; 
					num++;
				}
			}
			
		}
		else if(Num==3){
			if(i<10){
				n1=i%10;
				if(n1==0||n1==1||n1==2||n1==9){
					sum+=i; 
					num++;
				}
			}else if(i>=10&&i<100){
				n1=i/10%10;
				n2=i%10;
				if((n1==0||n1==1||n1==2||n1==9)||(n2==0||n2==1||n2==2||n2==9)){
					sum+=i; 
					num++;
				}
			}else{
				n1=i/100%10;
				n2=i/10%10;
				n3=i%10;
				if((n1==2||n1==0||n1==1||n1==9)||(n2==2||n2==0||n2==1||n2==9)||(n3==2||n3==0||n3==1||n3==9)){
					sum+=i; 
					num++;
				}
			}
			
		}
		else if(Num==2){
			if(i<10){
				n1=i%10;
				if(n1==0||n1==1||n1==2||n1==9){
					sum+=i; 
					num++;
				}
			}else{
				n1=i/10%10;
				n2=i%10;
				if((n1==0||n1==1||n1==2||n1==9)||(n2==0||n2==1||n2==2||n2==9)){
					sum+=i; 
					num++;
				}
			}
			
		}
		else if(Num==1){
			n1=i%10;
			if((n1==2||n1==0||n1==1||n1==9)){
				sum+=i; 
				num++;
			}
		}
	}
	cout<<sum<<endl;
}

22. 完全二叉树的权值

题目描述:
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一
部分的数列,只记得其中 N 个整数。现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

【输入格式】
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ~ A N 并不一定是按等差数列中的顺序给出)
【输出格式】
输出一个整数表示答案。

#include<iostream>
#include<cmath>
using namespace std;

int main(){
	int depthes[1000]={0},N,depth,sd[100]={0},max=0,f,h;
	cin>>N;
	depth=ceil(log2(N+1));
	for(int i=1;i<=N;i++){
		cin>>depthes[i];
	}
	for(int j=1;j<=N;j++){
		h=ceil(log2(j+1));
		sd[h]+=depthes[j];
	}
	for(int k=1;k<=depth;k++){
		if(sd[k]>max){
			max=sd[k];
			f=k;
		}
	}
	cout<<f<<endl;
}

23. 整数序列

题目描述:
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。

【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。

【评测用例规模与约定】
对于 80% 的评测用例,1≤n≤109。
对于所有评测用例,1≤n≤1018。

#include<iostream>
#include<string.h>
using namespace std;

int main(){
	int a[100],j=0,i,s;
	cin>>i;
	while(i){
		a[j]=i/2;
		i=i/2;
		j++;
		s++;
	}
	
	for(int m=0;m<s-2;m++){
		cout<<a[m];
		if(a[m+1]!=0)  cout<<",";
	}
}

24. 质数

题目描述:
我们知道第一个质数是2、第二个质数是 3第三个质数是5…
请你计算第2019个质数是多少?

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int flag=0;
  int num=2;
  for(int i=5;i<20000;i++){
    flag=0;
    for(int j=2;j<i;j++){
      if(i%j==0){
        flag=1;
        break;
      }
    }
    if(flag==0){
      num++;
      if(num==2019) cout<<i;
    }
  }

  return 0;
}

25. 走方格

题目描述:
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。

【输入格式】
输入一行包含两个整数 n, m。

【输出格式】
输出一个整数,表示答案。

【评测用例规模与约定】
对于所有评测用例,1≤n≤30,1≤m≤30。

#include<iostream>
using namespace std;
 
int main(){
	int n,m,i,j;
	int a[35][35];
	cin>>n>>m;   //行  列
	
	for(i=0;i<n;i++)  a[i][0]=1;
	for(j=0;j<m;j++)  a[0][j]=1;
	
	for(i=1;i<n;i++){
		for(j=1;j<m;j++){
			if((i+1)%2==0&&(j+1)%2==0)  a[i][j]=0;
			else
			    a[i][j]=a[i-1][j]+a[i][j-1];
		}
	} 
	cout<<a[n-1][m-1];
}

26. 排列字母

问题描述:
小蓝要把一个字符串中的字母按其在字母表中的顺序排列。
例如,LANQIAO排列后为AAILNOQ。
又如,GOODGOODSTUDYDAYDAYUP排列后为AADDDDDGGOOOOPSTUUYYY。
请问对于以下字符串,排列之后字符串是什么?
WHERETHEREISAWILLTHEREISAWAY

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
  string s;
  cin>>s;
  sort(s.begin(),s.end());
  cout<<s;
  return 0;
}

27. 日期问题

题目描述:
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

【输入描述】
—个日期,格式是”AA/BB/CC”(0≤A,B,C≤9)。
【输出描述】
输出若干个不相同的日期,每个日期一行,格式是”yyyy—MM —dd”。多个日期按从早到晚排列。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int year,int month,int day)
{
    if(month==0||month>12) return false;
    if(day==0) return false;
    if(month!=2)
    {
        if(day>days[month]) return false;
    }
    else
    {
        int leap=(year%4==0&&year%100!=0)||(year%400==0);
        if(day>28+leap) return false;
    }
    return true;
}

int main()
{
    int a,b,c;
    scanf("%d/%d/%d",&a,&b,&c);
    for(int i=19600101;i<=20591231;i++)
    {
        int year=i/10000;
        int month=i/100%100;
        int day=i%100;
        if(check(year,month,day))
        {
            if(year%100==a&&month==b&&day==c||
              month==a&&day==b&&year%100==c||
              day==a&&month==b&&year%100==c)
              printf("%d-%02d-%02d\n",year,month,day);
        }
    }
    return 0;
}

28. 饮料换购

题目描述:
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。

【输入描述】
输入一个整数n(0<n<1000),表示开始购买的饮料数量。
【输出描述】
输出一个整数,表示实际得到的饮料数

#include <iostream>
using namespace std;
int main()
{
  int num1=0,num2;
  int n;
  cin>>n;
  num2=n;
  while(n>=3){
    n-=2;
    num1++;
  }
  cout<<num1+num2;
  return 0;
}

29. 受伤的皇后

题目描述:
有一个n ×nr的国际象棋棋盘(n行n列的方格图),请在棋盘中摆放n个受伤的国际象棋皇后,要求:
1.任何两个皇后不在同一行。
2.任何两个皇后不在同一列。
3.如果两个皇后在同一条45度角的斜线上,这两个皇后之间行号的差值至少为3。
请问一共有多少种摆放方案。

【输入描述】
输入的第一行包含一个整数n。其中,1≤n ≤ 10。
【输出描述】
输出一个整数,表示答案。

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n;
  cin>>n;
  if(n==1||n==2)
  {
      cout<<1;
  }
  else if(n==3||n==4)
  {
      cout<<2;
  }
  else if(n==5||n==6)
  {
      cout<<5;
  }
  else if(n==7||n==8)
  {
      cout<<7;
  }
  else if(n==9||n==10)
  {
      cout<<9;
  }
  return 0;
}

30. 最大降雨量

题目描述:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。这个法术需要用到他手中的49张法术符,上面分别写着1至49这49个数字。法术一共持续7周,每天小明都要使用一张法术符,法术符不能重复使用。每周,小明施展法术产生的能量为这周7张法术符上数字的中位数。法术施展完7周后,求雨将获得成功,降雨量为7周能量的中位数。由于干早太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?

#include <iostream>
using namespace std;
int main()
{
/*
  * [][][][a][][][]
  * [][][][b][][][]
  * [][][][c][][][]
  * [][][][max][][][]
  * [][][][d][][][]
  * [][][][e][][][]
  * [][][][f][][][]
  * 
  * 此题意思为将1至49分为7组数字,求取七组数字中每组数字的中位数所构成的数列的中位数的最大值
  * 即如图所示,最大化[max]
  * 49个数字中需要比[max]大的有[max]行的后三位,d、e、f行的后四位,共3+3*4=15位
  * 结果为:49-15=34
  * */
  cout << 34 << endl;
}

31. 单词分析

题目描述:
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

【输入描述】
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过1000。
【输出描述】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

#include <bits/stdc++.h>//包含了目前c++所包含的所有头文件,是个万能库。
using namespace std;
int c[26];//表示从a到z的出现次数
int main()
{
    string a;
    char max;//出现最多次的字母
    int maxcount=0;//出现最多次的次数
    cin>>a;
    for(int i=0;i<a.length();i++){//遍历字符串如果出现了一次这个字母
        c[a[i]-97]++;//让这个字母对应数组下标的内容自增,表示出现一次,为了将数组下标定在0-26,根据a的asc码为97
    }
    for(int i=0;i<26;i++){
        if(c[i]>maxcount){
            maxcount=c[i];//找出出现次数最多的那个字母下标
            max=i+97;//根据下标找到对应字母
        }
    }
    cout<<max<<endl<<maxcount<<endl;
    return 0;
}

//c[26]定义成count[26]会关键字冲突,因为有些库里有count作为关键字
//int c[26];在主函数内定义会运行错误,因为在主函数哈希表存储为栈,需要加将其初始化为0,放入全局变量即放入堆中,默认初始化为0。

32. 卡片

题目描述:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有很多数字卡片,每张卡片上都是数字0到9。小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从1拼到多少。例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼11时卡片1已经只有一张了,不够拼出11。
现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?

分析:
因为1是排在最前面的,我们可以想出来1是最先进行消耗完毕的,所以我们只要记录下来1最后用尽的那一数是多少,我们可以使用一个while循环把1消耗进行记录下来,就是递减,出现1就递减1,等于0的时候就是我们需要的那一解

#include <iostream>
using namespace std;

int main()
{
    long int i=0;
    long int sum = 2021,tmp=0;
    long int b=0;
    for(i=1; i<20210; i++) {
        //记住需要一个数把i的值给记下来,因为后面的相除那一个数是发生变化 
        tmp=i;
        while(tmp) {
            b = tmp%10;
            if(b==1 && sum>0) {
                sum-=1;
            }
            tmp/=10;
        }
        if (sum==0) {
            break;
        }
    }
    cout<<i;
    return 0;
}

33. 空间

题目描述:
小蓝准备用256MB的内存空间开一个数组,数组的每个元素都是32位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问256MB的空间可以存储多少个32位二进制整数?

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
    //1MB=1024KB
    //1KB=1024B
    //1B=8b;
    //B:byte字节
    //b:bit比特(1位=1比特)
    //32位=4B
    //题解的意思是有多少个32位
    //转化成long long避免数据溢出
    cout<<(long long)256*1024*1024*8/32;
  return 0;
}

34. 时间显示

题目描述:
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从1970年1月1日00 : 00 : 00到当前时刻经过的毫秒数。现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

【输入描述】
输入一行包含一个整数,表示时间。
【输出描述】
输出时分秒表示的当前时间,格式形如HH:MM:Ss,其中出表示时,值为0到23,AM表示分,值为0到59,ss表示秒,值为0到59。时、分、秒不足两位时补前导0。

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  long long int h;
  cin >> h;
  int hh,mm,ss;
  h = h%(24*60*60*1000);//s
  hh = h/(60*60*1000)%24;
  mm = h/(60*1000)%60;
  ss = h/(1000)%60;
  printf("%02d:%02d:%02d\n",hh,mm,ss);
  return 0;
}

35. 分巧克力

题目描述:

儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有Ⅳ块巧克力,其中第i块是H;× Wi的方格组成的长方形。为了公平起见,
小明需要从这N块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1.形状是正方形,边长是整数;
2.大小相同;
例如一块6×5的巧克力可以切出6块2×2的巧克力或者2块3×3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?

【输入描述】
第一行包含两个整数N, K (1≤N,K ≤105)。
以下N行每行包含两个整数H,Wi (1 ≤H, W;≤105)。
输入保证每位小朋友至少能获得一块1×1的巧克力。
【输出描述】
输出切出的正方形巧克力最大可能的边长。

#include <iostream>
using namespace std;
int L[100005];
int W[100005];
int main()
{
    int N,K;
    cin>>N>>K;
    for(int i = 1; i <= N; i++)
        cin>>L[i]>>W[i];
    int i = 10000;
    while(true)
    {
        int sum = 0, num1, num2;
        for(int j = 1; j <= N; j++)
        {
            num1 = L[j] / i;
            num2 = W[j] / i;
            sum += num1 * num2;
        }
        if(sum >= K)
            break;
        i--;
    }
    cout<<i;
    return 0;
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月7日
下一篇 2023年12月7日

相关推荐