蓝桥杯编程基础

1.单位换算

(1)内存存储

        1PB = 1024TB = 1024 * 1024GB

        1GB = 1024MB =1024 * 1024KB = 1024 * 1024 * 1024B,1B = 8bit

(2)ASCII

大写字母 A - Z 的 ASCII 码:

大写字母 A 的 ASCII 码是 65。从 A 开始,往后每个大写字母的 ASCII 码依次递增 1。例如,B 的 ASCII 码是 66,C 的 ASCII 码是 67,一直到 Z,它的 ASCII 码是 90。可以简单地理解为,大写字母的 ASCII 码是一个连续的整数序列,起始点是 65,终点是 90。

小写字母 a - z 的 ASCII 码:

小写字母 a 的 ASCII 码是 97。同样地,从 a 开始,后续每个小写字母的 ASCII 码也依次递增 1。比如,b 的 ASCII 码是 98,c 的 ASCII 码是 99,一直到 z,它的 ASCII 码是 122。小写字母的 ASCII 码也是一个连续的整数序列,范围是从 97 到 122。

大写字母 ASCII 码 小写字母 ASCII 码
A 65 a 97
B 66 b 98
C 67 c 99
D 68 d 100
E 69 e 101
F 70 f 102
G 71 g 103
H 72 h 104
I 73 i 105
J 74 j 106
K 75 k 107
L 76 l 108
M 77 m 109
N 78 n 110
O 79 o 111
P 80 p 112
Q 81 q 113
R 82 r 114
S 83 s 115
T 84 t 116
U 85 u 117
V 86 v 118
W 87 w 119
X 88 x 120
Y 89 y 121
Z 90 z

122

(3)通过取余解决单位的换算问题:

对于时间:给定了毫秒也就是ms时,对应的秒,分钟和时间就是:

        seconds = ms / 1000 % 60 ,minutes = ms /( 1000 * 60 )% 60,hours = ms / ( 1000 * 60 * 60 ) % 60

而常见的输出格式为:HH:MM:SS。其中 HH 表示时,值为 00​​​​ 到 23​​​​,MM 表示分,值为 00​​​​ 到 59​​​,SS 表示秒,值为 00​​ 到 59​。时、分、秒 不足两位时补前导 00。所以对应的输出代码也就该为:

printf("%02d:%02d:%02d\n", hours, minutes, seconds);

注意:1.溢出问题:对于输入的数据是选择 int 还是 long long来存储

           2.输出问题:对于题目要求的输出格式需要注意是整型%d还是浮点数%f,%lf?而对于整型来说又有%d,%ld,%lld,%2d,%02d,对于小数来说又有%f,%lf,%.2f等。

2.日期问题

       我们将日期无非就是讲到那么几点,年、月、日、时、分、秒,以及他们在不同场景下的输入和输出。

        对于日期就绕不开闰年这个概念,闰年是指2月份有29天,它的判定条件为:被4整除的同时且不能够被100整除,或是被400整除等于0.

if((a%4==0 && a%100!=0) || a/400==0)

因为这是很基础的东西,所以需要把它牢记。因为对于月份其实没什么好讲的,除了需要注意闰年时2月份的天数,其它没有什么太大差别。

         接下来,我们可以学习一下如何更新星期一到星期天这个过程。因为一个星期是7天,我们在星期一到星期天时只需正常加1即可,那对于把星期天更新到星期一其实只需要对7取余即可。这样子的话就是(7 + 1)% 7 = 1了。

w = (w + 1) % 7;

让我们接着做到题试试(蓝桥云课P16955岁月流转):

        据记载,公元 19001900 年 11 月 11 日是周一。而在这段时间里,有多少个月的第一天是周日呢?请你帮助我们计算出这个数目,并告诉我们结果是多少。

        输出一个整数,表示在公元 1901 年 11 月 11 日到 2000 年 121月 31 日期间,有多少个月的第一天是周日。

参考代码如下:

#include 
#include 

int main(int argc, char *argv[])
{
  int n = 0 ;
  int num = ( 1900 % 400 == 0 ) || ( 1900 % 4 == 0 && 1900 % 100 != 0 ) ? 366 : 365 ;

  for( int i = 1901 ; i <=2000 ; i++ ) {
    int month[] = {0,31,( i % 400 == 0 ) || (( i % 4 == 0 ) && ( i % 100 != 0 ))?29:28,31,30,31,30,31,31,30,31,30,31};
    for( int j = 1 ; j <= 12 ; j++ ) {
      num += month[ j - 1 ];
      int k = num;
      if( k % 7 == 6 ) {
        n++;
      }
    }
    num += month[12];
  } 
  printf("%d",n);
  return 0;
}

其实道理很简单,假如现在是星期一(星期一记为0),那么是不是只要加上月数对7取余,余数是几,那下次是星期几就可以用星期一加上余数来得到。

总结:

其实,对于单位换算和日期常见的问题就那么几种,这些都是蓝桥杯中较容易掌握的知识点,只要稍加练习,相信各位天才都能很快学会!

你可能感兴趣的:(备战蓝桥杯,蓝桥杯,c语言,算法)