这个项目主要是为了复习博主之前关于C语言和数据结构的寒假作业,大家也可以根据这些题目自己进行填写并检查自己的知识点是否过关
博主也会有错误,所以如果大家看到错误,也希望大家能够进行指正,谢谢大家!
Day 01
一、选择题
这里主要考察的知识点是整形和浮点数在内存中的存储
首先我们看char a,一开始a=101,后来又加上了27,所以最后a的值存储的是128,而存储下来用int类型表示就是00000000 00000000 00000000 10000000,但是char类型大小1个字节,占8位,所以大小范围是-128~127,所以无法存储128,它会由127+1变成-128,其构造在我之前的文章中也有所提及,大家可以自行观看:
所以sum+=a的结果就是200-128=72,故选D
2、如下代码输出的是什么?
int value = 1024;
char condition = *((char*)(&value));
if (condition) value += 1; condition = *((char*)(&value));
if (condition) value += 1; condition = *((char*)(&value));
printf("%d %d", value, condition);
这里考察的与上题知识点基本相同,但多包含了机器的大小端这一知识点
value为1024 存储的形式为00000000 00000000 00000100 00000000,换成16进制即0x00000400,这个数在内存中的表现取决于机器的大小端存储模式,在大端存储模式下,该值在内存中会以高位字节在前的方式存储,而在小端存储模式下,该值在内存中会以低位字节在前的方式存储。之前博主的电脑尝试过,是小端机器,故排列为00 04 00 00,程序通过将这个整数的地址转换为 char* 类型指针,并读取该地址上的值,来操纵它的各个字节。程序首先读取 value 的最低有效字节,称为 condition。随后,程序对 condition 变量的每个比特进行检查,根据当前机器的大小端模式对 value 进行递增操作。由于condition很明显已经是0,因为value的最低有效字节为0,故所有的+1都不成立,所以输出为1024 0。
需要注意的是,一般我们的机器都是小端,如果题目并未详细说明,那么一般都以小端来判断
这里我们可能会以为sizeof(para)等于100,因为char类型占一个字节的内存空间,而里面有100个元素,所以我们理所当然认为其答案为100,但是在函数的参数中,其被自动转换成了指向字符的指针,实际上只传递了数组的第一个元素的地址,而指针的大小不论类型都是4个字节的大小,所以第一个答案为4;而第二个也是一样,虽然malloc了100个字节大小的内存空间,但是p只是一个指针,所以sizeof§同样是4,故答案为4,4
4、以下程序执行后的输出结果为( )
这里依旧是指针的问题,首先,我们传入的是数组s的首地址,p=p+1,即往后走了一个元素大小的地址,也就是从一开始的‘1’的前面,走到了‘2’的前面,所以这个时候的*s也就等于第二个元素2,输出的结果为2.
二维数组可以省略行但是不能省略列,所以passA选项,选择D选项;而让我们感到困惑的是B和C选项,我们分别进行分析:B选项int *s[8] 实际上声明了一个指针数组,而不是一个二维数组。每个元素都是一个指向整数的指针类型;对于 C 选项, int(*s)[8] 表示指向一个包含 8 个元素的一维数组。这种声明适用于接收指向二维数组的指针参数。
故答案为CD
编程题
1.自守数
#include <stdio.h>
int main() {
int n = 0;
int count = 0;
scanf("%d", &n);
for (int i = 0; i <= n; i++) {
int num = i * i;
if(num%10==i||num%100==i||num%1000==i||num%10000==i)
count++;
}
printf("%d", count);
return 0;
}
一开始我们只会想到尾数是最后一位数,但当我们仔细看题,发现尾数就是除了最大位之后的数字,另外,还不能忘了10000这个比较特殊的数,最后一个限定条件也要加上
另外,题主一开始还以为是平方的最后一位数与原数的最后一位数相同,犯了错误,所以大家也要看清楚题目要求
2.求小于n的质数
#include<stdio.h>
#include<math.h>
int main()
{
int N=0,count=0,i,j;
scanf("%d",&N);
for(i=2;i<=N;i++)
{
int k=i;
for(j=2;j<=sqrt(k);j++)
{
if(k%j==0)
break;
}
if(j>sqrt(k))
{
count++;//比如45,j到5的时候就break了,不是质数,小于根号45
//而46,j到7的时候才退出循环,而7大于根号45
}
}
printf("%d\n",count);
return 0;
}
这道题的难点重点在于如何求质数
质数只有两个正因数:1和它本身
要判断一个数是否为质数,我们需要检查从2到这个数的平方根之间的所有整数,看这个数是否能被其中任何一个整数整除。如果能被整除,那么这个数就不是质数;如果不能被整除,那么这个数就是质数。
为什么只需要检查到平方根呢?这是因为如果一个数n不是质数,那么它至少有一个大于1且小于n的因数a。这个因数a要么小于或等于sqrt(n),要么大于sqrt(n)。如果a大于sqrt(n),那么n/a(即另一个因数)就会小于sqrt(n)。这是因为两个大于sqrt(n)的数的乘积会大于n,这与n的定义矛盾。所以,我们只需要检查到sqrt(n)即可确定n是否为质数。