2022.4.9备战蓝桥杯B组

目录

字符串处理

日期计算

枚举算法:(暴力穷尽所有可能)

DP(动态分配)→(递归)+(递推)

sort排序


基础知识储备

 1B(字节)=8b(位)
1 KB = 1024 B
1 MB = 1024 KB

  1. bit(位,又名“比特”):bit的缩写是b,是计算机中的最小数据单位(属于二进制的范畴,其实就是0或者1)
  2. Byte(字节):Byte的缩写是B,是计算机文件大小的基本计算单位。比如一个字符就是1Byte,如果是汉字,则是2Byte。                                                                                                        

 题目:

 2022.4.9备战蓝桥杯B组_第1张图片


字符串处理

2022.4.9备战蓝桥杯B组_第2张图片

目录

字符串处理


#include 
using namespace std;
int main()
{
  int a[26] = {0};//输入26个英文字母
  int max = 0;//最大次数
  char max_c ;//最大次数的字母
  string s;cin >> s;
  for(int i = 0 ; i < s.size(); i++)//s.length(),s.size()
  {++a[s[i]  - 'a' ];}//'a'对应ASCII码的整数值,a[0]开始
  for(int i = 25 ; i >= 0; --i)//为了输出字典序最小的,得要倒序
    {
      if(a[i] >= max)
        {
          max = a[i];
          max_c = (char) i + 'a' ;//类型转化
        }  
    }
    

cout << max_c << endl << max << endl;//输出,注意换行
  return 0;
}

2022.4.9备战蓝桥杯B组_第3张图片

#include 
using namespace std;

  void trans(char &c)//首字母变大写
  {
    if(c >= 'a' && c <= 'z')
    c -= 32 ;
  }
  bool is_char(char c)
  {
    if((c >= 'a' && c <= 'z')||(c >= 'A' && c <= 'Z')) {return 1;}//    ||代表或,只要一个为真结果就为真
    return 0 ;
  }
 bool is_num(char c)
 {
   if(c >= '0'&& c <= '9'){return 1;}//  &&代表与/且,二者都为真才为真
   return 0 ;
 } 
 int main()
 {
   string s ;
   getline(cin,s) ;//只能读取不带空格的一个单词,要读一句话得要getline 
   if(is_char(s[0])) trans(s[0]);
   for(int i = 0;i < s.size(); ++i)
   {
     if(s[i] ==' '&& s[i] != s.size())
     {
      if(s[i+1]==' ')
      continue ;//遇到连续空格,跳出 
      cout << s[i] ;//照常答应 
      trans(s[i+1]) ;//将下一位转化为大写 
     }
     else if((is_char(s[i])&&is_num(s[i+1])) || (is_num(s[i]) && is_char(s[i+1]) ) )//判断 字母加数字或者数字加字母 
     cout << s[i] <<'_' ;//是就输出 前一个 + _  
     else cout << s[i] ;  
   }
 

        return 0;
 }

函数名         功能
strcpy 复制字符串
strcat 字符串拼接
strcmp 字符串比较
strlen //  s.size()   获取字符串长度

字符串的复制 

#include

strcpy(new , old ) ;// string copy 的缩写

将old字符串复制给 new ,

作用是:把含有\0结束符的字符串复制到另一个地址空间,返回值类型为char *

字符串的拼接

char* strcat( char* new ,char* old )

将old 字符串拼接到new 后面(new得有足够的空间)

字符串的比较

int strcmp(char* str1 , char *str2 ) ,从第一个字符开始逐字比较两个字符串的ASCII码。

如果下标为 i 的字符不相等 ,

则返回str 1 [ i ] - str 2 [ i ] ,

否则,返回()。

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

#include
#include
int main()
{
    char* str1 = "cd" ,str2 = "abc" ;
    int res = strcmp(str1, str2 ) ;
    if (res > 0 )
    {
        printf("%s is greater than %s\n",str1 , str2 ) ;
    }
    else if(res == 0 )
    {
        printf("%s is same as %s\n",str1 ,str2 ) ;
    }
    else {printf("%s is less than %s", str1 , str2) ;}
    return 0 ;
}
#include 
using namespace std;
char res [5000000] ;
int main()
{
	int n ;
	scanf("%d",&n ) ;
	int len = 0 ;
	for(int i = 1 ; i <= n ; i++ )
	{
		strcat(len + res +1   ,res) ;
		res[len] = 'A' + i - 1 ;
		len = strlen(res) ;
	}
	printf("%s\n", res ) ;
	return 0 ;
}

字符串 反转

int main()
{
    int len ;
    scanf("%s",&a ) ;//%s 打印字符串 
    len = strlen (a);
    for(int i = len-1 ;i>=0 ; i--)
    {printf("%c",a[i]) ;//%c 打印字符
    }
    printf("\n") ;
    return 0 ;
}

寻找字符串

 i miss you                         ossosso

you                                     osso

1                                          2

判断奇偶数

1:    if(s[len-1]&1 == 1){printf("奇 数");}
    else if (s[len -1]&1 == 0){printf("偶 数 ");}//用二进制的最后一位

2:if((s[len -1 ] - '0')%2 == 0){printf("偶 数)}//用ASCII码值 - 0 的代码 ,剩下几除2 ;

**技巧:

给定由大写,小写宇母和空格组成的宇符串,返回
最后一个单词的长度。                                  
如果输入中不存在单词,返回0。
注意:
‘单词〞是指不包含空格符号的宇符串
例如:
对于宇符串"hello World”(不带引1号),那么返回
的结果是 5;
对于宇符串"abc abc "(不带引1号),那么返回的
结果就是 3。

                                                                                                  小疑惑为什么部分devC++不行?  

​
#include
#include
using namespace std ;
char s[10005] ; 
int main()
{
	while(scanf("%s",&s) != EOF ) {}//输入到文件末尾,让他停下 。一直读 
	printf("%d\n",strlen(s));
	return 0 ; 
}

​

思路:把字符串去除最后的空格,再倒置。寻找空格的位置,返回。如果没有空格(一个单词),直接返回长度。 


日期计算

闰年 :2月份多一天 -------- 29天

1.年份非整百且能被4整除的年份:

2.年份能被400整除的年份(2000年即为闰年)

( (i%100 != 0 &&i %4 ==0 ) ||(i%400 ==0) )

《今天星期几呀!!》————实用

//输入三个正整数,分别表示年,月,日 
//输出星期几 
#include
#include
using namespace std ;
string weekday[7] = {"Mondy","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"} ;
int ans=0 ;
int whatday(int y , int m , int d )
{
	for(int i = 1 ; i < y ; i++){//year 
		if((i%100 != 0 && i%4 == 0)||(i%400 == 0)){
			ans+=366%7 ;
			ans %= 7 ;
		}
		else {
		ans+= 365 % 7 ;
		ans %= 7 ;				//除两回 得个位 。 
		}
	}
	for(int i = 1 ; i < m ; i++){
		if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){ans += 31%7;
		ans %= 7 ;}
		else if(i==4||i==6||i==9||i==11){ans += 30%7 ;
		ans %= 7 ;}
		
		else if((y%400 == 0) || (y % 4 == 0 && y % 100 != 0)){ans += 29%7;
		ans %= 7 ;}
		
		else{ans += 28%7  ;
		ans %= 7 ;}
	}
	ans+=(d-1)%7 ;
	ans %= 7 ;
	return ans ;
}
int main()
{
	int y , m ,d ;
	cin>>y>>m>>d ;
	cout << weekday[whatday(y,m,d)]<

神奇的公式:2022.4.9备战蓝桥杯B组_第4张图片

《算纪念日》

输入:年,月,日,天数,

输出:日期注意 月份天数用2位

#include
int day [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31} ;
int main()
{
	int y, m , d, k;
	scanf("%d%d%d%d",&y,&m,&d,&k ) ;
	for(int i = 1; i <= k ; i ++ )
	{
		if(( y%400 == 0)||(y % 4 == 0 && y % 100!= 0 )){day[2] =29;
		}
		else {day[2] = 28 ;}
		d++ ;   
		if(d == day[m]+1){
			d = 1 ;
			m++ ;
		}
		if(m == 13){
			m = 1;
			y++ ;
		}
	} 
	printf("%04d-%02d-%02d\n",y,m,d ) ;//yyyy-mm-dd形式 
	return 0 ;
}


枚举算法:(暴力穷尽所有可能)

循环结构→DFS

一个循环,选取枚举范围,条件判断语句

2022.4.9备战蓝桥杯B组_第5张图片

#include
int main()
{
	int dad =0,son =0 ;
	for(int i =27 ;i<= 99 ;i++)
	{
		dad = i ;
		son =(i%10)*10+ i/10 ;//1%10 求个位 再*10 换到10位.i/10 直接求十位 。
		if(dad-son==27){printf("%d\n",dad) ;
		}
	}
}
//三位数上每个位的数字的三次幂之和 = 本身
//水仙花数
#include
int main() {
	for(int i =100 ;i<=999 ; i++)
	{
		int a=i%10 ;//个位 
		int b=(i%100)/10 ;//十位
		int c=i/100 ;//百位
		a= a*a*a ;
		b= b*b*b ;
		c= c*c*c ;
		if(a+b+c == i){
			printf("%d\n",i ) ;
		}
	}
} 
//求n的阶乘
#include 

long factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    else {
        return factorial(n - 1) * n;  // 递归调用
    }
}

/*(10000-99999)五位数的不要出现带4的号码
如果发行从n到m 的之间的奖券,在任何两张奖券都不重复的情况下
一共可以发行多少张奖券?*/

<复杂版>


#include
using namespace std ;

int main(){
	int n =0,m = 0 ;
	cin>>n>>m ;
	int number =0;
	for(int i = n ; i <= m ; i++)
	{
	
		if((i%10 != 4)&&(i%100/10 != 4)&&(i%1000/100 != 4)&&
        (i%10000/1000 != 4)&&(i/10000 != 4 )) //个,十,百,千,万 位
		{
			
			number += 1 ; 
		}

	
	}
			
			cout<

<简化版> 

#include
using namespace std ;

bool judge(int x )//真假类型
	{
		while(x){           // while 取每一位
			if(x%10 == 4 ){  // 先看最后一位是否有4
				return true ;// 非零整数表示真
			}
		x/=10 ;//执行完重复上式
		}
		return false;//值0 表示假
	}
	int main()
{
	
	int n = 0 ,m = 0 ,cnt = 0 ;
	cin>>n>>m ;
	
	for(int i = n  ;i <= m ; i++  )
	{
		if(!judge(i))
		{cnt++;
		}
	} 
	
	cout<

2022.4.9备战蓝桥杯B组_第6张图片while  搭配 bool

——————————上难度啦——————————————————————

2022.4.9备战蓝桥杯B组_第7张图片

// 加 、乘  前后的两数颠倒顺序 也算新的一种

// 算一算一共有多少种方案

2022.4.9备战蓝桥杯B组_第8张图片

方法一:用枚举方法较复杂,不过可以巩固自己

方法二:要用到next_permutation()全排列函数



next_permutation /用法举例

#include 
using namespace std ;
int main()
{
    int num = 1,a[6]= {1,2,3,4,5};
    
    cout<<"1 2 3 4 5"<

1.

2022.4.9备战蓝桥杯B组_第9张图片

#include
using namespace std ;
int main()
{
	 int n ; 
	 cin >> n ;
	 for(int a = 1 ;a*a <= n ; a++ )
	 {	for(int b = a+1 ; a*a+b*b <= n ; b++)
	 		{for(int c = b + 1 ; a*a+b*b+c*c <= n; c++ )
	 			{
	 				if(a*a+b*b+c*c == n ){
	 					cout<

1. plus

/*

四平方和定理:
每个正整数可以表示为至多4个正整数平方之和,
if 把 0 包括进去 正好可以表示成 4个数 平方和
给定一正整数 n ,求出字典序最小的一组 a, b, c, d 使得平方和为 n
输出:4个非负整数 a, b, c, d  中间空格分开 。 
*/ 

#include
using namespace std ;
int main()
{
	int n ,d ;
	scanf("%d",&n ); 
	for(int a = 0; a*a <= n ; a++){
		for(int b = a ; a*a+b*b <= n ; b++){
			for(int c = b ;a*a+b*b+c*c <= n ; c++){
				d = sqrt(n - (a*a+b*b+c*c) )  ;//如果不能 开更号 则显示整数部分 
				if(a*a+b*b+c*c+d*d == n ){     //这一步将不成立 
				    printf("%d %d %d %d\n",a,b,c,d) ;
				    return 0 ;
				}
			}
		}
	}
	return 0 ;
} 

2.

2022.4.9备战蓝桥杯B组_第10张图片

#include
using namespace std ;
int main()
{
	int n , m ,ans ;
	cin>>n>>m ;
	ans = -1005 ;
	int a[55][55] = {0} ;
	for(int i = 0;i< n;i++)//读入 矩阵 
	{	for(int j = 0 ;j< m ; j++ )
		{
			cin>>a[i][j] ;
		}
		
	}
	for(int i = 0;i < n;i++)//上边界 
	{	for(int j = i ;j < n ; j++ )//下边界 	
		{
			for(int k = 0 ;k < m ;k++)//左边界 
			{
				for(int l = k ;l < m ;l++ )//右边界 
				{
					int tmp = 0 ;
					for(int p = i ;p <= j ;p++ )//扫描从i行到j行 
					{
						for(int q = k ;q <= l ; q++ )//扫描k列到q列 
						{
		 				tmp += a[p][q] ;
						}
					}
					if(tmp > ans ){ ans = tmp ;}//把每回框出来的的元素和  与 ans
					 
				}
		
			}
		
		}
	}		
	cout<

2022.4.9备战蓝桥杯B组_第11张图片

如图 2 X 2 的矩阵 有 9种不同的子矩阵

3.

输入 n

输入从a1-an 一串对应整数 

输出 从中裁剪连续一段中 的最大和

#include
using namespace std ;
int main()
{
	int n ;
	int sum = 0 ;
	int max = 0;
	int a[1005 ] ;
	cin>>n ;
	for(int i = 0 ; i< n ; i++ )
	{
		scanf("%d",&a[i]) ;
	}
	for(int i = 0;i < n; i++)
	{
		sum = 0;//每一轮缩小都要清 ,不然就会sum+= 
		for(int j = i ; j=max){max = sum ;} 
		}
	}
	cout<

DP(动态分配)→(递归)+(递推)
 


sort排序

   

#include
#include
using namespace std ;
int main()
{
    int arr[] = {2,4,5,3,1} ;
    return 0 ; 
}

此时 sort( arr , arr + 5 ) ;// sort( 起始位置 ,终了位置 +1 )  要多写一位

sort ( arr + i , arr + j ) // 被排序的是 arr[ i ] 到 arr [ j - 1 ] , 其他元素保持原位置

//默认从小到大

// if 希望从大到小的排列 (安某个规则排列也可 ) ,为 sort  传入第三个参数——“排序方法”

#include
#include
using namespace std ;
int main()
{
    int arr[] = {2,4,5,3,1} ;
    sort(arr , arr + 5 ,greater() ) ;
    return 0 ; 
}

greater ——表示更大,  ——表示待排序数组中的元素类型为 int ,让一个元素类型为整数的数组从大到小排列 。

//计算前k名学生的平均成绩  
#include
#include
using namespace std ;
int main ()
{
	int K , N ;
	int score[35] = {0} ;
	scanf("%d\n",&N) ;
	for(int i = 0 ; i < N ; i++ ){
		scanf("%d", &score[i] ) ;
	}
	sort(score,score + N,greater() ) ;
	scanf("%d\n", &K ) ;
	int sum = 0 ;
	double avg = 0 ; 
	for(int j = 0 ; j < K ; j++ )
	{
		sum += score[j] ;
	}
	avg = sum*1.0 / K ;
	printf("%.2f\n",avg ) ;
	getchar() ;
	return 0 ;
	
}

小疑惑 为啥有时候还得多敲个字符 才能执行   // 

你可能感兴趣的:(c++)