★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录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开辟的内存空间,数组的长度我们是不知道的也无法作为函数结果进行返回,因此只能通过解引用的方式进行值的修改。