蓝桥杯算法练习笔记(1)__字符串和日期

本文章基于《计蒜客2019年蓝桥杯算法训练营》整理记录,仅用于个人学习交流使用。

1.ASCII码值

48–0 65–A 97–a

C++中ASCII码与常用字符之间的转化

int main(){	
	// char 转化为 ASCII 码 
	char c1='A';
	cout<<(char)(c1+1)<<endl;//B 
	//ASCII 转化为 char
	cout<<(int)c1<<endl;//65
	cout<<c1+1<<endl;//66(默认转化为int)  
    return 0;
} 
2.字母三角形
#include
#include
using namespace std;

int main(){	
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		/* string的一种用法 
		   string str=string(字符的个数,字符); 
		   第二个变量要写字符,而不是字符串,因为多个字符组合成字符串
		*/
		string space=string(n-i,' ');
		string ch=string(2*i-1,'A'+i-1);
		cout<<space+ch<<endl;
	}
    return 0;
} 

//案例
输入:
5

输出:
    A
   BBB
  CCCCC
 DDDDDDD
EEEEEEEEE

1.字母三角形升级版本

/* 
输入:
F
输出:
     A
    ABA
   ABCBA
  ABCDCBA
 ABCDEDCBA
ABCDEFEDCBA

输入:
5
输出:
       1
      121
     12321
    1234321
   123454321
*/

#include
#include
using namespace std;

int main() {
	char c;
	cin>>c;
	if(c>='A'&&c<='Z') {
		for(int i=1; i<=c-'A'+1; i++) {
			for(int j=1; j<=c-'A'+1-i; j++) {
				cout<<" ";
			}
			for(int j=1; j<=i; j++) {
				cout<<(char)('A'+j-1);
			}
			for(int j=i-1; j>=1; j--) {
				cout<<(char)('A'+j-1);
			}
			cout<<endl;
		}

	}

	else {
		for(int i=1; i<=c-'1'+1; i++) {
			for(int j=1; j<=c-'1'+1-i; j++) {
				cout<<" ";
			}
			for(int j=1; j<=i; j++) {
				cout<<(char)('1'+j-1);
			}
			for(int j=i-1; j>=1; j--) {
				cout<<(char)('1'+j-1);
			}
			cout<<endl;
		}

	}
}

1.小明圈宝藏问题

#include
using namespace std;

int main() {
	int n,m;
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			cout<<"+-";
		}
		cout<<"+"<<endl;

		for(int j=1; j<=m; j++) {
			cout<<"|*";
		}
		cout<<"i"<<endl;
	}

	for(int j=1; j<=m; j++) {
		cout<<"+-";
	}
	cout<<"+"<<endl;
	return 0;
}

// 样例
输入:
3	4
输出:
+-+-+-+-+
|*|*|*|*|
+-+-+-+-+
|*|*|*|*|
+-+-+-+-+
|*|*|*|*|
+-+-+-+-+
3.字符串和字符数组

参考博客:https://blog.csdn.net/ksws0292756/article/details/79432329

1.基本内容
	定义字符数组:char  *ch="abcde";	char ch2[20];

1.只有以\0为末尾结束的才算是字符串,(否则只能算是字符数组),在C中,只有以\0结束的才可以用“%s”的printf输出,否则会输出一个奇怪的结果。。。?

2.C++中string直接赋值不改变原先的长度。。。?
   
    int main() {
        string s1="123456789";
        string s2="123";
        cout<<s1.size()<<endl;//9
        cout<<s2.size()<<endl;//3
        s1=s2;
        cout<<s1.size()<<endl;//3

    }

3.复制字符串:C中函数原型char *strcpy(char *destin,char *source),将source字符串复制到destin
4.拼接字符串:C中函数 char *strcat(char *dest,char *soruce),将source字符串拼接到dest后面,但是dest必须要有足够的空间显示拼接出来的字符串
5.比较字符串:C中函数 int strcmp(char *str1,char *str2),从第一个字符开始逐字符比较两个字符的ASCII码值,如果下标为i的字符串不相等,则函数返回 str1[i]-str2[i]。如果两个字符串完全相等,则会返回0(如果返回结果大于0,则第一个串大;如果小于0,则第一个串小)

#include
#include
int main() {
   	char name[10];
   	char *str="abcdefg";
   	strcpy(name,str);
   	printf("%s\n",name);
   	return 0;
   }
  1. 判断字符串在一个字符串中出现的次数
   #include
   #include
   #include
   using namespace std;
   char s1[1005],s2[1005];
   
   int main() {
   	//函数原型:char *fgets(char *str, int n, FILE *stream);
   	/*  n 读取的最大字符数,换行符也会读取
   	 	stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。 
   	 	/*从输入流stdin即输入缓冲区中读取n个字符到字符数组str中*/
   	*/ 
   	fgets(s1,1004,stdin);
   	fgets(s2,1004,stdin);
   	//字符长度-1是减去换行符 
   	int len1=strlen(s1)-1;
   	int len2=strlen(s2)-1;
   	int ans=0;
   	for(int i=0; i+len2-1<len1; i++) {
   		bool matched =true;
   		for(int j=0;j<len2;j++){
   			if(s1[i+j]!=s2[j]){
   				matched=false;
   				break; 
   			}
   		}	
   		if(matched){
   			ans++;
   		}
   	}
   	cout<<ans<<endl;
   	return 0;
   }
4.日期判断

1.判断今天是星期几?

1.模拟法:记住某天是星期几(例如公元11日是星期一),然后一天天模拟计算
        
    	#include
        using namespace std;

        int whatday(int y,int m,int d){
            int ans=0;
            //计算过去当前年之后是星期几,从1月1日星期一开始计算 
            for(int i=1;i<y;i++){
                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%100!=0 && y%4==0)|| y%400==0){
                    ans+=29%7;
                    ans%=7;
                }else{
                    ans+=28%7;
                    ans%=7;
                }
            }
            //计算过去几天后 
            ans+=(d-1)%7;
            ans %= 7;

            return ans; 
        }
        string weekday[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
        int main() {
             int y,m,d;
             cin>>y>>m>>d;
             cout<<weekday[whatday(y,m,d)]<<endl; 
        }


2.菜吉姆拉尔森计算公式:设星期为w,年份为y,月份为m,日期为d
    w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7
    在把计算的w+1就是真正的星期几
    注:每年的1,2月要当成上一年的13,14月来计算
  
      int main() {
        //w=(d+2xm+3x(m+1)/5+y+y/4-y/100+y/400)%7
        int w,d,m,y;
        cout<<"年";	cin>>y;
        cout<<"月";	cin>>m;
        cout<<"日";	cin>>d; 

        if(m==1){
            m=13;
            y=y-1;
        }
        if(m==2){
            m=14;
            y=y-1;
        }
        w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
        cout<<"星期"<<w+1<<endl;

        return 0;
    }

2.判断自某天起N天后

输入:一个开始日期	几天后
输出:一个日期

        #include
        using namespace std;

        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%100 !=0 && y%4==0) || (y%400==0)){
                    day[2]=19;
                }else{
                    day[2]=28;
                }
                d++;
                if(d==day[m]+1){
                    d=1;
                    m++;
                }

                if(m==13){
                    m=1;
                    y++;
                }

            }

            printf("%04d-%02d-%02d",y,m,d); 
        }

你可能感兴趣的:(蓝桥杯练习笔记,算法,字符串)