★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。
1、下列程序的输出是( )
#include
int main()
{
int a [12]= {1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i;
for(i=0;i<4;i++)
p[i]=&a [i*3];
printf("%d\n",p[3][2]);
return 0;
}
A: 上述程序有错误 B: 6 C: 8 D: 12
正确答案:D
答案解析:p[i]是二元数组中每一行首元素的地址,所以原数组可以分为:1,2,3//4,5,6//7,8,9//10,11,12这样4行3列的二维数组,p[3][2]=12,选项D正确。
2、二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4] 的存储地址为Oxf8b82140 , X[9][9] 的存储地址为Oxf8b8221c ,则X[7][7] 的存储地址为( )
A: Oxf8b821c4 B: Oxf8b821a6 C: Oxf8b82198 D: Oxf8b821c0
正确答案:A
答案解析:设数组每一行有n个元素,从Oxf8b82140到Oxf8b8221c可以列出方程,n-5+4n+10=5n+5=220,结果n=43。所以X[7][7]的地址为2*43+43-5+8=1c4(注意是十六进制的计算)。
3、以下哪个选项可以正确描述sizeof(double) ( )
A: 一个整型表达式 B: 一个双精度型表达式 C: 一个不合法的表达式 D: 一种函数调用
正确答案:A
答案解析:sizeof是C语言中的一个操作符,不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数,结果是无符号整数,因此可以把它看作是整型表达式,选项A正确。
4、下列代码运行后的结果是什么( )
int main()
{
char a = 'a',b;
printf("%c,", ++a);
printf("%c\n", b = a++);
return 0;
}
A: b,b B: b,c C: a,b D: a,c
正确答案:A
答案解析:变量a里边存的是字符’a’,第一次输出先加加再输出,输出的是’b’,a的值并没有改变;第二次输出的时候,a先赋值再加加,赋值给b的就是a原来的值,输出b的时候的还是’b’,选项A正确。
程序运行截图:
5、以下逗号表达式的值为( )
(x = 4 * 5 , x * 5) , x + 5;
A: 25 B: 20 C: 100 D: 45
正确答案:A
答案解析:先计算4*5并赋值给x,x变为20,中间x*5并没有改变x的值,最后一项x+5值是25,也就是整个表达式的值,选项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]
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
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开辟的内存空间,数组的长度我们是不知道的也无法作为函数结果进行返回,因此只能通过解引用的方式进行值的修改。