ICS要期中考了…
ICS要期中考了…
ICS要期中考了…
还是先复盘一下昨天晚上崩溃的作业吧🙂
3.71
本来以为只要读入指定的长度就好了,然而发现是需要全部读入的
那么既然不可能有无限大的缓冲区,就只能分次读入啦
void good_echo(){
char buf[16];
while(fgets(buf,16,stdin)!=NULL) {
char *p=buf; while(*p)
putchar(*p++); if(strlen(buf)<15) break;
} return; }
emmm要记住fgets无输入或出错时的返回值是NULL
一开始用了puts(buf)输出,然而它一次读完会换行,这是强迫症不能允许的
如果不加if(strlen(buf)<15) break;程序就会进入死循环(难道不能返回NULL??我也不是很懂……)
重要在思路:对超出缓冲区长度的处理方式
3.72
这题真是有趣的不知道说什么,建议先看下3.10.5的习题3.49,几乎是一样的
是酱紫的,先把%rbp压入,把那时候的%rsp储存起来(便于返回),然后求8n+30向下舍入的最接近的16的倍数(为了对齐),然后开放这么大的栈帧,再求开放后%rsp+15的向下舍入的最接近的16的倍数(为了对齐)
大概就是上面这样~
先看一下第一次舍入的结果,当n=2k,x=8k+16
当n=2k+1,x=8k+24
好了我们要求e1的最值
由于p的长度对每个n是固定的,所以要e1最小,必须e2最大,先看看e2=15有没有可能
e2=15,相当于s2+15 %16==0,当n=2k,有s1-8n-16+15 %16==0,s1-8n %16==1,这个1就是e1,代入n,此时s1%16==1
当n=2k+1,e1=9
再求e1最大值,同样先看e2=0有没有可能
e2=0,相当于s2%16==0,当n=2k+1,有s1-8k-24%16==0,这个24就是e2最大值,代入此时s1%16==0
当n=2k,e1=16
昨天才通知要考期中了……
要加油复习呀!!!!冲冲冲!!😗😗😗😗