算法复习总结(1)

入门模拟

日期处理问题

日期处理问题中,需要处理平年和闰年(由此产生的二月的天数的问题)、大月和小月的问题。

首先,什么是闰年和平年?
小学学的东西自己都不知道。。。遇到整百年时要被400整除才是闰年,否则为平年;遇到非整百年时,只要被4整除就是闰年,否则为平年。闰年的2月有29天,平年的闰月有28天。
程序中可以通过(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) 来进行判断。
日期的输入形式通常为: YYYYMMDD,可以将其作为整数输入,然后通过下面代码处理来获得对应的年月日:y1 = time1 / 10000; m1 = time1 % 10000 / 100; d1 = time1 % 100;

在日期处理中的一个很常见的问题就是去计算日期的差值,这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第二个日期为止,即可统计出答案。具体处理时,如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1、同时置天数d为1天;如果此时月份变为了13,那么就令年份y加1,同时置月份m为1月。

为了方便取出每个月的天数,不妨给定一个二维数组int month[13][2] ,用来存放每个月的天数,其中第二维为0时表示平年,为1时表示闰年。

如果一开始想加快速度,只需要把第一个日期的年份不断加1,直到与第二个日期的年份相差1为止,期间根据平年还是闰年来累加365天或者366天即可。

进制转换问题

将P进制数x为a1a2…an转换为十进制数:

int y = 0, product = 1;     //product在每个循环中会不断乘P
while(x!=0){
    y = y + (x % 10) * product;   //为了每次获取x的个位数
    x = x / 10;
    product = product * P;
}

将十进制数转换为Q进制,结果存放于数组z

int z[40], num=0;
do{
    z[num++] = y % Q;  //除基取余
    y = y / Q;
}while(y != 0);

使用do-while循环是因为其能够正确处理十进制为0的情况,即z数组第一个位置存0。

字符串处理

没有通法,需要多加练习。

猜你喜欢

转载自blog.csdn.net/hbhgyu/article/details/81157665