今日因时间过晚,把忘记的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字节。对应测试命令如下:
当不将分片的情况下发送数据大小为1473字节的数据包时会导致数据无法发送,具体命令如下:
ping命令 -f 参数是用来设置发送数据不分片的,-l 是用来设置发送数据的字节大小的。实在不知道ping命令有什么参数以及参数的作用可以直接在命令行打ping后回车即可。
于2021年3月9日23点24分完成博客编写,若发现错误望指正。