2021年3月8日与3月9日学习记录

今日因时间过晚,把忘记的C语言指针部分捡了回来,明日大更新!
以上发布于2021年3月9日00:32。

以下开始编写于2021年3月9日18点50分


学习记录

每日任务有两项:做题和总结当天所学知识。做题由简单到困难,刷题顺序是PAT->蓝桥杯->牛客->力扣->PAT···。周日专门用来完成课时作业。
写博客进行自我监督
day 8,9✔

牛客练习

AC题目:1007 母牛的故事,1008 童年生活二三事

1007题目描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?(0<n<55)

测试用例:
2
4
5

用例结果:
2
4
6

解题思路:经过穷举的方式发现数据存在以下规律,从第4个数字开始num[i] = num[i-1] + num[i-3],将上面的思维转换成计算机高级语言即可。

代码如下:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n;
    long long num[56] = {1,2,3};
    for(int i = 3;i <= 55;i++){
        num[i] = num[i-1] + num[i-3];
    }
    while(scanf("%d",&n) != EOF){
        printf("%lld\n",num[n-1]);
    }
    system("pause");
    return 0;
}

1008题目描述:
NowCoder小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。
但年幼的他一次只能走上一阶或者一下子蹦上两阶。
现在一共有N阶台阶,请你计算一下NowCoder从第0阶到第N阶共有几种走法。
测试用例:
1
2

用例结果:
1
2

此题思路:
1.简单的使用数字加法进行计算,注意这个数字可能会很大,换大一点的整形就行(long long即可)(斐波那契数列典型题不多说原理了,我都做了几次斐波那契数列的题了??基本就是换汤不换药)
2.可以采用字符串相加的方式进行计算(涉及C指针的知识,计算机组成原理中数据存储形式,C二维字符串数组的存储形式)

先来简单思路的代码:

#include<stdio.h>

int main()
{
    int n;
    long long a[90] = {1,2};
    for(int i = 2;i <= 90;i++){
        a[i] = a[i-1] + a[i-2];
    }
    while(scanf("%d",&n) != EOF){
        printf("%lld\n",a[n-1]);
    }
    return 0;
}

在来涉及C指针的解法:(先展示代码在进行分析)

#include<stdio.h>
#include<string.h>

void add(char *sum,int i,int len1,int len2){
    int jin = 0;
    int index  = 0;
    char *index1 = (sum-1000)+len1-1;//为什么-1000可以参考下面的解释(-2000)同理
    char *index2 = (sum-2000)+len2-1;
    while(index1 >= (sum-1000) || index2 >= (sum-2000)){
        if(index2 >= (sum-2000)){
            *((sum)+index) = ((*index1 - '0') + (*index2 - '0') + jin) % 10 + '0';
            jin = ((*index1 - '0') + (*index2 - '0') + jin) / 10;
        }else{
            *((sum)+index) = ((*index1 - '0') + jin) % 10 + '0';
            jin = ((*index1 - '0') + jin) / 10;
        }
        --index1;
        --index2;
        ++index;
    }
    if(jin > 0){
        *((sum)+index) = jin + '0';
        ++index;
    }
    *((sum)+index) = '\0';
}

int main()
{
    int n;
    char sum[91][1000] = {"1","2"};
    for(int i = 2;i <= 90;i++){
        add(sum[i],i,strlen(sum[i-1]),strlen(sum[i-2]));//这里传的是下标为i的一维数组,要注意add函数使用的地址
        int len = strlen(sum[i]);
        for(int j = 0;j < len / 2;j++){
            char t = sum[i][j];
            sum[i][j] = sum[i][len-1 - j];
            sum[i][len-1 - j] = t;
        }
    }
    while(scanf("%d",&n) != EOF){
        printf("%s\n",sum[n-1]);
    }
    return 0;
}

首先了解:什么是C指针?
指针其实就是用来存地址的一个变量。(我们可以简单的认为指针也是下标,但是标明的是内存的地址而已)
其次了解:C指针的意义?
如上所诉指针是存地址的,那拿到地址了就可以做很多相对应的事情,比如拿着地址访问数据,拿着地址修改数据等等。
在是了解:指针的指针代表什么?
指针的指针可以简单的理解为:访问指针(于加粗的那个指针对应)对应的数据。拟人化总结以下其实就是:指针相当于你知道了门牌号,你可以顺着门牌号过去,你想知道门后面是什么就需要钥匙,而这个要是就是指针的指针。

知道了上面这些还不够,我们还需要知道字符串在内存中是怎么存的。还要知道二维的字符串数组是怎么存的。

首先我们先了解一维的字符串数组是怎么存的。第一,我们知道字符类型大小占1字节,所以我们给字符串开辟了多大的空间,那么字符串的 末字符的 起始地址 就是 起始地址加上开辟空间大小减去1。

那么移动指针的语法是什么呢?是这样的: *指针名+位移量

以上均为2021年3月8日号的学习记录,完成编写时间21点59分


day 9

网络知识
ICMP首部8字节,IP最小20字节。在以太网中传输的MTU最大为1500字节,所以在网络层不分片的数据包最大能传输的数据大小为:1500-20-8 = 1472字节。对应测试命令如下:

1472
当不将分片的情况下发送数据大小为1473字节的数据包时会导致数据无法发送,具体命令如下:

在这里插入图片描述
ping命令 -f 参数是用来设置发送数据不分片的,-l 是用来设置发送数据的字节大小的。实在不知道ping命令有什么参数以及参数的作用可以直接在命令行打ping后回车即可。




于2021年3月9日23点24分完成博客编写,若发现错误望指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值