C语言题目强化-DAY10


★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。


一、选择题

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

int func(int x)
{
	int count = 0;
	while (x)
{
	count++;
	x = x&(x - 1);//与运算
}
	return 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);

A: 1 B: 2 C: 32 D: 死循环,没结果

正确答案:D
答案解析
有符号数右移运算高位是补符号位的,负数的符号位是1,所以x永远不会变为0,所以是个死循环,选项D正确。

3、下述赋值语句错误的是( )
A: a = (b = (c = 2 , d = 3)) B: i++ C: a/b = 2 D: a = a < a + 1

正确答案:C
答案解析
a/b是表达式,表达式计算的结果是一个值不能做左值,所以选C。

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:(y<z?y:z)加个括号应该就好理解了w<x为真,返回w,即表达式的值为1,选项A正确。

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,选项A正确。

二、编程题

1、自除数 是指可以被它包含的每一位数除尽的数。例如, 128 是一个自除数,因为 128 % 1== 0 ,128 % 2 ==0 ,128 % 8 == 0 。还有,自除数不允许包含 0 。给定上边界和下边界数字,输出一个列表,列表的元素是边界
(含边界)内所有的自除数。
leetcode【leetcode 题号:728. 自除数】

示例:
输入:上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
int* selfDividingNumbers(int left, int right, int* returnSize){
    //...
}
int isSelfDividing(int num) {		
    int tmp = num;
    while (tmp > 0) {
        int digit = tmp % 10;						//对余数的值进行判断
        if (digit == 0 || num % digit != 0) {		//余数不能为0且要不能被整除的时候,返回0
            return 0;
        }
        tmp /= 10;
    }
    return 1;										//如果都遍历完了都还没返回0,那么说明这个数是自除数
}

int* selfDividingNumbers(int left, int right, int* returnSize){
    int * arr = (int *)malloc(sizeof(int) * (right - left + 1));//开辟内存
    int j = 0;
    for (int i = left; i <= right; i++) {						//循环遍历left-right所有的数
        if (isSelfDividing(i)) {								//每个数进行函数包装单独判断
            arr[j] = i;
            j++;
        }
    }
    *returnSize = j;
    return arr;
}

代码思路:遍历从left-right之间的所有整数,对于每一个整数进行函数单独判断是否是自除数,需要注意的是余数为0的时候,这个数依然不能作为自除数。

2、给你一个长度为 n 的整数数组 nums ,其中 n > 1 ,返回输出数组 output ,其中 output[i] 等于 nums 中除nums[i] 之外其余各元素的乘积。
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

leetcode【leetcode 题号:238. 除自身以外数组的乘积】

示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize){
}
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    *returnSize = numsSize;
    int mul = 1;
    int* output = (int*)malloc(numsSize * sizeof(int));
    int j = 0;
    for (int i = 0; i < numsSize; i++)
    {
        mul = 1;
        for (j = 0;  j < numsSize; j++)
        {
            if(j!=i)
            mul *= nums[j];
        }
        output[i] = mul;
    }
    return output;
}

代码思路:简单的循环判断题,其中需要注意的是函数参数有一个int* returnSize,这个参数的意思是向函数传递了返回数组的元素个数,也就是说外面定义了返回数组的长度,但是长度可能只是初始化了一下,所以我们在函数内部需要用指针访问去赋值一下,因为是malloc开辟的内存空间,数组的长度我们是不知道的也无法作为函数结果进行返回,因此只能通过解引用的方式进行值的修改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学不会编程的小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值