《算法笔记知识点记录》第三章——入门模拟(2)

简介: 《算法笔记知识点记录》第三章——入门模拟(2)

🏑1.3 图形输出

有些题目会给出一定的规则,需要我们来根据规则画出对应的图形,其实就是由若干字符按照一定的规则输出。一般分为两种形式


通过规律直接输出。

定义一个二维字符数组,按照规律进行填充一次性输出。

看个例子。


【PAT B1036】 跟奥巴马一起编程 (15 分)

题目描述


美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!


输入格式:


输入在一行中给出正方形边长 N(3≤N≤20)和组成正方形边的某种字符 C,间隔一个空格。


输出格式:


输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。

样例输入


10 a


样例输出


aaaaaaaaaa

a      a

a      a

a      a

aaaaaaaaaa


解题思路


由于行数为列数的一半,如果列数是偶数的时候,行数就是n/2;如果列数是奇数的时候,行数就是n/2+1,不如做个统一都是(n+1)/2。

通过分析发现,由三部分组成,第1行和第row行都是输出n个a,对于第2~row-1的每一行,都是先输出一个a最后再输出一个a,然后中间输出col-2个a。

所以我们而已先输出一个a,然后输出row-2个空格,然后输出一个a。


参考代码


#include<cstdio>
int main(){
  int row, col;
  char c;
  scanf("%d %c",&col,&c);
  row = (col +1)/2; //选取行数
  for(int i = 0;i < row;i++){
  if(i == 0 || i == row -1){
    for(int j = 0;j < col;j++)
    printf("%c",c);
    puts("");
    continue;
  }
  printf("%c",c);//输出第一个c
  for(int j = 0;j < col -2;j++)
    printf(" ");
  if(col > 1) printf("%c",c);
  puts("");
  }
  return 0;
}


🏏1.4 日期处理

日期的处理总会让人头疼,因为涉及到处理闰年的问题、大月小月的问题,因此细节比较繁杂,但是只要细心处理细节,这类问题就会很简单。

看个例子:


问题 A: 日期差值


题目描述


有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。


输入格式:


有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出格式:


每组数据输出一行,即日期差值


样例输入


20130101

20130105


样例输出


5

解题思路


不妨设第一个日期早于第二个日期,如果不早交换就可以了。

有一个常用的思路:令日期不断的加1天,直到第一个日期等于第二个日期即可。

具体操作时:

如果加一天之后天数d等于当前月份m所拥有的天数+1,则令月份m+1,同时置天数为1;

如果月份加1后等于13,则年份加1,同时把月份变为1.

为了方便的计算每个月份的天数,不妨设置一个二维数组int month[13][2]来表示闰年和平年的每个月份的天数。

注意:如果想要加快速度,就将第一个日期的年份不断加1到与第二个年份相差1即可,期间根据年份来判断加365还是增加366,最后再不断令天数加1操作。


参考代码


#include<cstdio>
int month[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
    //有个口诀,四年一闰。百年不闰,四百年再闰
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
int main(){
    int time1, y1, m1, d1;
    int time2, y2, m2, d2;
    while(scanf("%d %d", &time1, &time2) != EOF){
        if(time1 > time2){
            //swap
            time1 = time1 ^ time2;
            time2 = time1 ^ time2;
            time1 = time1 ^ time2;
        }
        y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
        y2 = time2 / 10000, m2 = time2 % 10000 / 100, d2 = time2 % 100;
        int ans = 1;
        //当不相等的时候循环
        while(y1 < y2 || m1 < m2 || d1 <d2){
            d1++;
            if(d1 == month[m1][isLeap(y1)] + 1){
                m1++;
                d1 = 1;
            }
            if(m1 == 13){
                y1 ++;
                m1 = 1;
            }
            ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}


🏂1.5 进制转换

日常生活使用的进制一般是十进制,而计算机使用的进制是二进制,另外还有八进制,十六进制以及各种数字进制,这就会产生一个问题:对于不同进制如何转换呢?

对于一个P进制转换为Q进制,需要分为两步


将P进制转换为十进制


8f578129d3d9ea9131c3fc5fdbc78ae.png

8f578129d3d9ea9131c3fc5fdbc78ae.png

这个的相关算法实现也很简单

int y = 0, product = 1;//product 不断乘p得到p的不同次方
while(x != 0){
  y = y + (x % 10) * product;//每次取出最低位 看起来像十进制
  x = x / 10;
  product *= p;
}


将十进制转化为Q进制(大名鼎鼎的除留余数法)

例如要将11转化为2进制

11 / 2 商5 余1

5 /2 商2 余1

2/2 商1 余0

1/2 商0 余1

从下往上看 可以得到2进制为(1011)2

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


这里使用do…while的原因是可以规避掉0的特殊处理


【PAT B1022】D进制的A+B (20 分)


题目描述


输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。


输入格式:


输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:


输出 A+B 的 D 进制数。


样例输入


123 456 8

样例输出


1103

解题思路


先计算A+B的十进制,然后将结果转化为D进制,而十进制转化为D进制的可以使用除留余数法。


参考代码


#include<cstdio>
int main(){
    int a, b, d;
    scanf("%d %d %d", &a, &b, &d);
    int sum = a + b;
    int ans[31], num = 0;   //ans存放d进制的没一位
    do{
        ans[num++] = sum % d;
        sum /= d;
    }while(sum != 0);
    for(int i = num - 1;i >= 0;i--)
        printf("%d",ans[i]);
    puts("");
    return 0;
}


相关文章
|
7月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
434 2
|
12月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
126 0
|
12月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
131 0
|
12月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
462 1
|
12月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
90 1
|
12月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
264 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
11月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
151 0
|
12月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
747 0
|
12月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
158 0
|
12月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
124 0

热门文章

最新文章