本文章基于《计蒜客2019年蓝桥杯算法训练营》整理记录,仅用于个人学习交流使用。
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;
}
#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
输出:
+-+-+-+-+
|*|*|*|*|
+-+-+-+-+
|*|*|*|*|
+-+-+-+-+
|*|*|*|*|
+-+-+-+-+
参考博客: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;
}
#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;
}
1.判断今天是星期几?
1.模拟法:记住某天是星期几(例如公元1月1日是星期一),然后一天天模拟计算
#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);
}