目录
选择题部分
第一题
知识点 整形提升
这里的结果类型是随着值的级别上升,而上升的,由右图得知
由上往下,级别上升的,所以本题答案就为D double类型了
第二题
知识点 无符号整形 整型提升
这道题涉及到了整型提升了,unsigned int类型变量在和Int 类型变量比较的时候,int类型变量会整型提升为unsigned Int
会导致在比较x>y的时候x的值发生改变,是因为x变成了无符号整形了
-1 原码是1000 0001 补码就是1111 1111了 不同的类型,提取出来就会是不一样的数值,x和y比较,它们的类型就要相等,由于y是无符号整形,所以提取x(-1)补码出来进行整型提升,而我们知道无符号整形是没有正负的,这也就意味着原码,反码,补码是相等的
这样无符号整形x就是1111 1111了,为4294967295,2的32次方,答案为A了 X更大,但是我们要记住,这并没有改变X的值,这是因为不同的类型,提取出来就会是不一样的数值,补码没有改变的。。换言之无符号整形是没有负数的
第三题
知识点(无符号整形)
本题选B,因为w是无符号整形,所以并不存在负数形式的,而表达式中w+=-20是w=w-20;这会导致w为负数,可是w是无符号整型,所以这D选项是不符合C语言语法的。
第四题,下面函数的输出结果
知识点,移位操作符理解,原码补码
答案是选C -2 .1的补码是0000 0001,向左移31位就是1000 0000,然后取反+1,就到了11111111
等于-2147483648,取反+1获得补码1000 0001,右移31位就是1111 1111,移去的补符号位1,取反+1获得原码1000 0001 (这里为了方便,简化了一下,改成了16进制)
是-1,我们再1^-1,就等于-2了 因为1^1=0 1^0=1 0^1=0 0^0=0
第五题
sizeof不是一个函数,他是一个操作符,是可以咱编译期间就完成的,直接就是4了,运行不用执行i++这个操作,所以i不变,为1。
编程题部分
力扣485 最大连续1的个数
读题目,二进制数组nums,计算最大连续1的个数
我们得到,这需要去遍历这个数组,去寻找连续1的个数,所以我们呢,需要创建count来记录当前连续1的个数,还需要建立sum来记录最大连续1的个数,这两个count和sum需要区分的,不能混为一谈
int findMaxConsecutiveOnes(int* nums, int numsSize)
{
int i;
int sum=0;
int count=0;
for(i=0;i<numsSize;i++)
{
if(nums[i]==1)
{
sum++;
}
else
{
sum=0;
}
if(sum>count)
{
count=sum;
}
}
return count;
}
牛客网 HJ56 完全数计算
遍历呗,通过两层for循环找到的因数,再相加就可以,再去比较就ok了,比较简单的
/*
直接穷举计算,注意,1不算完全数,一直遍历到当前数的一半即可。
*/
#include<stdio.h>
int main(){
int n = 0;
int count = 0;
scanf("%d",&n);
for(int j = 2; j <=n; j++){
int sum = 1;
for(int i = 2; i <= j/2; i++){
if(j%i==0){
sum = sum + i;
}
}
if(sum==j) count++;
}
printf("%d",count);
return 0;
}