• 数组、字符串、日期笔记【蓝桥杯】


    判断某年某月某日是星期几 

    1. 1.模拟法:记住某天是星期几(例如公元11日是星期一),然后一天天模拟计算
    2. #include
    3. using namespace std;
    4. int whatday(int y,int m,int d){
    5. int ans=0;
    6. //计算过去当前年之后是星期几,从11日星期一开始计算
    7. for(int i=1;i<y;i++){
    8. if((i%100!=0 && i%4==0) || (i%400==0) ){
    9. //闰年
    10. ans+=366%7;//
    11. ans %=7;
    12. } else{
    13. ans += 365%7;
    14. ans %= 7;
    15. }
    16. }
    17. //计算过去当前月之后,是星期几
    18. for(int i=1;i
    19. if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
    20. ans+=31%7;
    21. ans%=7;
    22. } else if(i==4 || i==6 || i==9 || i==11){
    23. ans+=30%7;
    24. ans%=7;
    25. }else if((y%100!=0 && y%4==0)|| y%400==0){
    26. ans+=29%7;
    27. ans%=7;
    28. }else{
    29. ans+=28%7;
    30. ans%=7;
    31. }
    32. }
    33. //计算过去几天后
    34. ans+=(d-1)%7;
    35. ans %= 7;
    36. return ans;
    37. }
    38. string weekday[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
    39. int main() {
    40. int y,m,d;
    41. cin>>y>>m>>d;
    42. cout<y,m,d)]<
    43. }
    44. 2.菜吉姆拉尔森计算公式:设星期为w,年份为y,月份为m,日期为d
    45. w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7
    46. 在把计算的w+1就是真正的星期几
    47. 注:每年的1,2月要当成上一年的13,14月来计算
    48. int main() {
    49. //w=(d+2xm+3x(m+1)/5+y+y/4-y/100+y/400)%7
    50. int w,d,m,y;
    51. cout<<"年"; cin>>y;
    52. cout<<"月"; cin>>m;
    53. cout<<"日"; cin>>d;
    54. if(m==1){
    55. m=13;
    56. y=y-1;
    57. }
    58. if(m==2){
    59. m=14;
    60. y=y-1;
    61. }
    62. w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
    63. cout<<"星期"<1<
    64. return 0;
    65. }

    打印十字图形(蓝桥杯真题)

    问题描述

    1. 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
    2. ..$$$$$$$$$$$$$..
    3. ..$...........$..
    4. $$$.$$$$$$$$$.$$$
    5. $...$.......$...$
    6. $.$$$.$$$$$.$$$.$
    7. $.$...$...$...$.$
    8. $.$.$$$.$.$$$.$.$
    9. $.$.$...$...$.$.$
    10. $.$.$.$$$$$.$.$.$
    11. $.$.$...$...$.$.$
    12. $.$.$$$.$.$$$.$.$
    13. $.$...$...$...$.$
    14. $.$$$.$$$$$.$$$.$
    15. $...$.......$...$
    16. $$$.$$$$$$$$$.$$$
    17. ..$...........$..
    18. ..$$$$$$$$$$$$$..
    19. 对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
    20. 输入格式
    21. 一个正整数 n (n<30) 表示要求打印图形的层数。
    22. 输出格式
    23. 对应包围层数的该标志。
    24. 样例输入1
    25. 1
    26. 样例输出1
    27. ..$$$$$..
    28. ..$...$..
    29. $$$.$.$$$
    30. $...$...$
    31. $.$$$$$.$
    32. $...$...$
    33. $$$.$.$$$
    34. ..$...$..
    35. ..$$$$$..
    36. 样例输入2
    37. 3
    38. 样例输出2
    39. ..$$$$$$$$$$$$$..
    40. ..$...........$..
    41. $$$.$$$$$$$$$.$$$
    42. $...$.......$...$
    43. $.$$$.$$$$$.$$$.$
    44. $.$...$...$...$.$
    45. $.$.$$$.$.$$$.$.$
    46. $.$.$...$...$.$.$
    47. $.$.$.$$$$$.$.$.$
    48. $.$.$...$...$.$.$
    49. $.$.$$$.$.$$$.$.$
    50. $.$...$...$...$.$
    51. $.$$$.$$$$$.$$$.$
    52. $...$.......$...$
    53. $$$.$$$$$$$$$.$$$
    54. ..$...........$..
    55. ..$$$$$$$$$$$$$..

    解法

    1. #include
    2. using namespace std;
    3. const int MAX=130; //需设置为大于5+4*30的数
    4. bool map[MAX][MAX];
    5. void print(int n)
    6. {
    7. //通过n计算出打印十字图的规格(N*N)
    8. int N=5+4*n;
    9. //首先标记最内层的十字架
    10. for(int i=N/2-1;i<=N/2+3;i++)
    11. map[N/2+1][i]=map[i][N/2+1]=true; //一横一竖
    12. //然后从最外层到里层逐个标记十字架
    13. for(int i=1;i<=n;i++)
    14. {
    15. //接下来标记四个边角部分
    16. int x=2*i+1,y=2*i+1;
    17. //左上边角
    18. map[x][y]=map[x][y-1]=map[x-1][y]=true;
    19. //右上边角
    20. y=N-2*i;
    21. map[x][y]=map[x][y+1]=map[x-1][y]=true;
    22. //右下边角
    23. x=N-2*i;
    24. map[x][y]=map[x][y+1]=map[x+1][y]=true;
    25. //左下边角
    26. y=2*i+1;
    27. map[x][y]=map[x][y-1]=map[x+1][y]=true;
    28. //接下来标记十字架的非边角部位(即“四个墙壁”)
    29. for(int j=2*i+1;j<=N-2*i;j++)
    30. map[2*i-1][j]=map[j][N-2*(i-1)]=map[N-2*(i-1)][j]=map[j][2*i-1]=true;
    31. }
    32. //打印
    33. for(int i=1;i<=N;i++){
    34. for(int j=1;j<=N;j++)
    35. if(map[i][j]) cout<<"$";
    36. else cout<<".";
    37. cout<
    38. }
    39. }
    40. int main()
    41. {
    42. int n;
    43. cin>>n;
    44. print(n);
    45. return 0;
    46. }

    日期问题(蓝桥杯真题)

    问题描述

    小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

    更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

    比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。

    给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

    输入描述

    输出若干个不相同的日期,每个日期一行,格式是 “yyyy-MM-dd”。多个日期按从早到晚排列。

    示例

    输入
    02/03/04
    输出
    2002-03-04
    2004-02-03
    2004-03-02
    1. #include
    2. using namespace std;
    3. int arr[13]= { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//记录每个月的天数
    4. struct date {//日期的结构体
    5. int year, month, day;
    6. };
    7. date da[3] = { 0 };//结构体数组
    8. bool isLeap(int y) {
    9. return ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)); //判断是否为闰年
    10. }
    11. void f(int a, int b, int c,int d)//判断日期是否合法同时存入数组中
    12. {
    13. if (a >= 60)
    14. {
    15. a += 1900;
    16. }
    17. else
    18. {
    19. a += 2000;
    20. }
    21. da[d].year = a;
    22. if (isLeap(a)) arr[2] = 29;
    23. if (b > 0 && b < 13 && c>0 && c <= arr[b]) {
    24. da[d].month = b;
    25. da[d].day = c;
    26. }
    27. }
    28. bool bijiao(date a, date b)//sort排序函数对应的排序规则
    29. {
    30. if (a.year == b.year)
    31. {
    32. if (a.month == b.month)
    33. {
    34. return a.day < b.day;
    35. }
    36. else
    37. {
    38. return a.month < b.month;
    39. }
    40. }
    41. else return a.year < b.year;
    42. }
    43. int main()
    44. {
    45. string s;
    46. cin >> s;
    47. int a, b, c;
    48. a = stoi(s.substr(0, 2));
    49. b = stoi(s.substr(3, 2));
    50. c = stoi(s.substr(6, 2));
    51. f(a, b, c, 0);//此处分别对三种情况进行判断
    52. f(c, b, a, 1);
    53. f(c, a, b, 2);
    54. int arr1[3] = { 0 };
    55. sort(da,da+3, bijiao);//将合法的日期排序
    56. date dd = da[0];
    57. for (int i = 1; i <= 2; i++)//去除相同的日期
    58. {
    59. if (da[i].year == dd.year&& da[i].month == dd.month && da[i].day == dd.day)
    60. {
    61. da[i] = { 0,0,0 };
    62. }
    63. else
    64. {
    65. dd = da[i];
    66. }
    67. }
    68. for (int i = 0; i < 3; i++)//循环输出结果
    69. {
    70. if (da[i].day != 0)
    71. {
    72. cout << da[i].year << "-" << setw(2) << setfill('0') << da[i].month << "-" << setw(2) << setfill('0') << da[i].day << endl;
    73. }
    74. }
    75. return 0;
    76. }

    ASCII码

    48–'0'

    65–'A'

    97–'a'

    常用用法

    1. int main(){
    2. // char 转化为 ASCII 码
    3. char c1='A';
    4. cout<<(char)(c1+1)<//B
    5. //ASCII 转化为 char
    6. cout<<(int)c1<//65
    7. cout<1<//66(默认转化为int)
    8. return 0;
    9. }

    字母三角形

    1. #include
    2. using namespace std;
    3. int main(){
    4. int n;
    5. cin>>n;
    6. for(int i=1;i<=n;i++){
    7. /* string的一种用法
    8. string str=string(字符的个数,字符);
    9. 第二个变量要写字符,而不是字符串,因为多个字符组合成字符串
    10. */
    11. string space=string(n-i,' ');
    12. string ch=string(2*i-1,'A'+i-1);
    13. cout<
    14. }
    15. return 0;
    16. }
    17. //案例
    18. 输入:
    19. 5
    20. 输出:
    21. A
    22. BBB
    23. CCCCC
    24. DDDDDDD
    25. EEEEEEEEE

    主要是知道string的这种用法即可

    升级版

    1. /*
    2. 输入:
    3. F
    4. 输出:
    5. A
    6. ABA
    7. ABCBA
    8. ABCDCBA
    9. ABCDEDCBA
    10. ABCDEFEDCBA
    11. 输入:
    12. 5
    13. 输出:
    14. 1
    15. 121
    16. 12321
    17. 1234321
    18. 123454321
    19. */
    20. #include
    21. using namespace std;
    22. int main() {
    23. char c;
    24. cin>>c;
    25. if(c>='A'&&c<='Z') {
    26. for(int i=1; i<=c-'A'+1; i++) {
    27. for(int j=1; j<=c-'A'+1-i; j++) {
    28. cout<<" ";
    29. }
    30. for(int j=1; j<=i; j++) {
    31. cout<<(char)('A'+j-1);
    32. }
    33. for(int j=i-1; j>=1; j--) {
    34. cout<<(char)('A'+j-1);
    35. }
    36. cout<
    37. }
    38. }
    39. else {
    40. for(int i=1; i<=c-'1'+1; i++) {
    41. for(int j=1; j<=c-'1'+1-i; j++) {
    42. cout<<" ";
    43. }
    44. for(int j=1; j<=i; j++) {
    45. cout<<(char)('1'+j-1);
    46. }
    47. for(int j=i-1; j>=1; j--) {
    48. cout<<(char)('1'+j-1);
    49. }
    50. cout<
    51. }
    52. }
    53. }

    先正着输到最中间,然后保留那个数再倒着输

    日期排序(牛客题)

    题目描述

    有一些日期,日期格式为“AA/BB/CCCC”。编程将日期从小到大排列。

    输入描述:

    输入一个整数N,代表输入日期的个数。接下来N行,输入N个格式为“AA/BB/CCCC”的日期

    输出描述:

    输出排序后的日期,一个日期占一行

    示例1
    输入
    6
    10/22/2003
    02/12/2004
    15/12/1999
    12/31/2005
    10/21/2003
    11/30/2005

    输出
    15/12/1999
    10/21/2003
    10/22/2003
    02/12/2004
    11/30/2005
    12/31/2005

    我的题解

    1. #include
    2. using namespace std;
    3. class date{
    4. public:
    5. date(int year,int month,int day);
    6. bool operator < (const date& d);
    7. void print(){
    8. cout<<setw(2)<<setfill('0')<'/'<<setw(2)<<setfill('0')<'/'<
    9. }
    10. private:
    11. int year;
    12. int month;
    13. int day;
    14. };
    15. date::date(int year,int month,int day){
    16. this->year=year;
    17. this->month=month;
    18. this->day=day;
    19. }
    20. bool date::operator < (const date& d){
    21. if(this->year
    22. return true;
    23. }else if(this->year>d.year){
    24. return false;
    25. }else{
    26. if(this->month
    27. return true;
    28. }else if(this->month>d.month){
    29. return false;
    30. }else{
    31. if(this->day
    32. return true;
    33. }else{
    34. return false;
    35. }
    36. }
    37. }
    38. }
    39. int main(){
    40. int n,y,m,d;
    41. char c;
    42. scanf("%d",&n);
    43. vector a;
    44. for(int i = 0; i
    45. cin>>d>>c>>m>>c>>y;
    46. date b(y,m,d);
    47. a.push_back(b);
    48. }
    49. sort(a.begin(), a.end());
    50. for(int i = 0 ; i < n ; ++i){
    51. a[i].print();
    52. }
    53. }

    这题的需要注意的地方在于输入和输出的问题

    scanf("%d/%d/%d",&d,&m,&y)  像这样就可以满足题目的那种格式,scanf可以自定义格式

    或者像我的题解那样单独再设个char c 来吸收'/'

    输出格式——setw()只会影响它后面 一个 的输出​​​​​​​

  • 相关阅读:
    C++ STL的vector深入理解
    openarena
    Unity编辑器拓展-Odin
    金仓数据库KingbaseES运维工具参考手册(3. 系统数据与日志收集工具)
    面试:Android中的HOOK方案
    Hadoop总结——HDFS
    【小吉测评】高效简洁的数据库管控平台—CloudQuery
    微信小程序开发实战(常用的内置组件)
    leetcode.无重复字符的最长字串(刷题日记)
    Websocket升级版
  • 原文地址:https://blog.csdn.net/qq_61786525/article/details/125959274