C语言假期作业 DAY 10

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C语言假期作业 DAY 10

一、选择题

1、求函数返回值,传入 -1 ,则在64位机器上函数返回( )

int func(int x)
{
int count = 0;
while (x)
{
count++;
x = x&(x - 1);//与运算
} r
eturn count;
}

A: 死循环

B: 64

C: 32

D: 16

答案解析

正确答案: C
x=x&(x-1) 这个表达式执行一次就会将 x 的 2 进制中最右边的 1 去掉,在 x 变成 0 之前,表达式能执行几次,就去掉几个 1 ,所以 这个代码实现了求一个有符号整数二进制补码中1 的个数的功能,我们知道 -1 的补码是全 1 ,而 int 类型 4 个字节 32 位,选 C  


2、读代码选结果( )

int count = 0;
int x = -1;
while(x)
{
count++;
x = x >> 1;
}
printf("%d",count);
int main()
{
int a=1,b=2,m=0,n=0,k;
k=(n=b<a)&&(m=a);
printf("%d,%d\n",k,m);
return 0;
}

A: 1

B: 2

C: 32

D: 死循环,没结果

答案解析

正确答案: D

此题一个关键,有符号数右移运算高位是补符号位的,负数的符号位是 1 ,所以 x 永远不会变为 0 ,是个死循环

3、下述赋值语句错误的是( )

A: a = (b = (c = 2 , d = 3))

B: i++

C: a/b = 2

D: a = a < a + 1

答案解析

正确答案: C

C 选项中 a/b 是表达式,表达式计算的结果是一个值不能做左值

4、若有 int w=1, x=2, y=3, z=4; 则条件表达 w < x ? w : y < z ? y : z 的值是( )

A: 1

B: 2

C: 3

D: 4

答案解析

正确答案: A

w<x?w:(y<z?y:z) 加个括号应该就好理解了 w<x 为真,返回 w ,即表达式的值为 1

5、以下程序运行后的输出结果是( )

int main()
{
int a=1,b=2,m=0,n=0,k;
k=(n=b<a)&&(m=a);
printf("%d,%d\n",k,m);
return 0;
}

A: 0,0

B: 0,1

C: 1,0

D: 1,1

答案解析

正确答案: A

k=(n=b<a)&&(m=a); 这部分的执行顺序如下:先执行 n=b<a 部分,其中,关系运算符优先级高于赋值运算符,所以先算b<a,得到 0 , n=0 赋值运算的结果将作为括号内表达式的结果,即 (n=b<a)&&(m=a) 转换成 (0)&&(m=a) , && 运算前表达式为假,则后面的括号(m=a) 不运算, m 值还是 0 ,最后, && 的结果是 0 ,即 k=0

二、编程题

1:不用加减乘除做加法

不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com)

描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

数据范围:两个数都满足 0 \le n \le 10000≤n≤1000

进阶:空间复杂度 O(1)O(1),时间复杂度 O(1)O(1)

示例1

输入:1,2

返回值:3

示例2

输入:0,0

返回值:0

【答案解析】

十进制相加思想: 15+07 , 先计算不考虑进位的相加结果 12 (因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位嘛),然后计算进位 5+7 进位是 10 ,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。

这里使用二进制求和完成,思想类似,但是二进制计算相加和进位不需要使用 + 符号二进制相加思想:与十进制相同,先计算不考虑进位的相加结果( 0+0 得 0 , 1+1 进位得 0 , 1+0 得 1 ),使用异或可以取得; 然后计算相加的进位结果(同 1 的位置左移一位即可),使用相与后左移取得。

示例


int Add(int num1, int num2)
{
  while (num2 != 0) 
  { //进位不为0则持续与相加结果进行相加 
    int tmp = num1 ^ num2;     //得到每位相加不考虑进位的数据 
    num2 = (num1 & num2) << 1; //同1的位相加则会进位
    num1 = tmp;
  }
  return num1;
}

2:LeetCode448. 找到所有数组中消失的数字

448. 找到所有数组中消失的数字 - 力扣(LeetCode)


给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

示例 1

输入:nums = [4,3,2,7,8,2,3,1]

输出:[5,6]

示例 2

输入:nums = [1,1]

输出:[2]

提示

n == nums.length

1 <= n <= 105

1 <= nums[i] <= n

进阶

你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

【答案解析】

numsSize 大小的数组,其中每个元素的数据在 [1, numsSize] 区间之内,解法其实并不复杂,以数组元素的绝对值作为下标,将对应位置的数据置为负数,比如 0 号位置是 3 ,则把 3 号位置的数据重置为负值,等到数组遍历重置完毕,只有缺失的这个数字对应的位置保留正数,其他出现过的数字位置都会是负数, 要注意不要重复设置负数,因为负负得正。

示例



int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) 
{
  for (int i = 0; i < numsSize; i++)
  { 
    if (nums[abs(nums[i]) - 1] > 0) nums[abs(nums[i]) - 1] = -(nums[abs(nums[i]) - 1]);
  }
  int* ret = (int*)malloc(sizeof(int) * (numsSize)); 
  *returnSize = 0; 
  for (int i = 0; i < numsSize; i++)
  {
    if (nums[i] > 0) 
    { 
      ret[*returnSize] = i + 1;
      *returnSize += 1; 
    }
  }
  return ret;
}
相关文章
|
6月前
|
C语言
[日常]C语言作业详解12_17(题型对应知识点)
[日常]C语言作业详解12_17(题型对应知识点)
55 0
|
6月前
|
算法 程序员 编译器
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
49 0
|
6月前
|
存储 Linux C语言
C语言初阶⑥(操作符详解)编程作业(算数转换)(下)
C语言初阶⑥(操作符详解)编程作业(算数转换)
38 1
|
6月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(下)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
38 1
|
6月前
|
存储 C语言 索引
C语言初阶⑥(操作符详解)编程作业(算数转换)(上)
C语言初阶⑥(操作符详解)编程作业(算数转换)
45 0
|
6月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(上)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
38 0
|
6月前
|
存储 人工智能 搜索推荐
【C语言进阶】 假期测评①
【C语言进阶】 假期测评①
58 2
|
6月前
|
存储 安全 BI
【C语言进阶】假期测评②
【C语言进阶】假期测评②
67 1
|
6月前
|
存储 测试技术 C语言
【C语言进阶】 假期测评③
【C语言进阶】 假期测评③
67 1
|
6月前
|
存储 C语言
C语言进阶---------作业复习
C语言进阶---------作业复习