暑假第十二天之每天一些题系列
Posted 小赵小赵福星高照~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第十二天之每天一些题系列相关的知识,希望对你有一定的参考价值。
暑假第十二天之每天一些题系列
一、选择题
- 定义了一维 int 型数组 a[10] 后,下面错误的引用是
A. a[0] = 1 B. a[0] = 5*2 C. a[10] = 2 D. a[1] = a[2] * a[0]
答案解析:
a[10]越界访问了,10个元素下标是0-9。
- 在C/C++语言中,下面关于数组的描述错误的是
A. 数组的名字就是指向该数组第一个元素的指针
B. 长度为n的数组,下标的范围是 0-n-1
C. 数组的大小必须在编译时确定
D. 数组可通过值参数、地址指针、引用参数三种方式传递给函数
答案解析:
动态开辟的数组在运行时确定大小
- 若已定义: int a[] = [0,1,2,3,4,5,6,7,8,9]; int *p = a; int i; 其中 0≤i≤9 ,则对a数组错误的引用是
A. a[p-a] B. *(&a[i]) C. p[i] D. a[10]
答案解析:
数组的下标为0-9,a[10]已经越界访问了
- 在C语言中,若有定义: int a[4][10](其中0<=i<4,0<=j<10); 则下列选项中不能表示数组元素 a[i][j] 值的是
A.*(a+i)+j B. *(&a[0][0]+10*i+j) C. *(a[i]+j) D. *(*(a+i)+j)
答案解析:
*(a+i)+j表示的是a[i][j]的地址,需要对它再解引用才是a[i][j]
-
关于数组定义 double d[10] 以下叙述不正确的是
A. 数组 d 有10个元素
B. 数组 d 的最后一个元素是 d[10]
C. 数组 d 的第一个元素 *d
D.数组 d 的字节数是 sizeof(double)*10
答案解析:
数组d有10个元素,正确;数组d的最后一个元素是d[9];d是数组名,数组名是首元素的地址,对他解引用就是首元素;字节数等于,数组元素类型的大小乘以元素个数
二、填空题
- 如下代码输出结果是什么
int f(int x,int y)
{
return (x&y)+((x^y)>>1);
}
int main()
{
int result = f(2,4);
printf("%d\\n", result);
return 0;
}
答案解析:
2的二进制为:00000010
4的二进制为:00000100
按位与得:00000000
按位异或得:00000110
将它右移一位得:00000011
然后将它和按位与得的结果相加得结果为3,故最后打印为3
- 循环语句 for(i=0; i<=n; i++) S; 中循环体S被执行的次数为
答案解析:
循环体S被执行得次数为n+1。
- 下面的程序运行结果是
void fun ( int x,int y,int *c,int *d )
{
*c = x+y;
*d = x-y;
}
int main ()
{
int a = 4,b = 3,c = 0,d = 0;
fun(a,b,&c,&d);
printf( "%d %d\\n",c,d);
}
答案解析:
可以看到c、d为值传递,在函数里面将c改为7,d改为1,故打印为7,1。
三、算法题
题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。例如数组为{1,3,5,7,1,3,5,9},找出7和9。
思路:
将所有数字先异或得到两个只出现一次的数字异或后的结果num,然后进行分组,特别的需要将两个只出现一次的数字分在不同组,这样我们这两个组内数字再分别异或就得到了这两个数字。
那么我们怎么分组呢?
我们想一想异或是相同为0,不同为1,这两个不一样的数字异或结果不可能为0,我们找num的二进制中为1的位数,以这一位为0还是1来分组,为0的在一组,为1的在一组,最后将两组数字分别再异或就得到了这两个数字
代码如下:
void FindTwoNum(int* nums,int len)
{
int i = 0;
int num = 0;
for (i = 0; i < len; i++)
{
num ^= nums[i];
}
//分组
int pos = 0;
for (i = 0; i < 32; i++)
{
if (((num << i) & 1) == 1)
{
pos = i;//找出二进制为1的那一位的位置
}
}
int num1 = 0;
int num2 = 0;
for (i = 0; i < len; i++)
{
if (((nums[i] << pos) & 1) == 1)
{
num1 ^= nums[i];
}
else
{
num2 ^= nums[i];
}
}
printf("%d %d\\n", num1, num2);
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
FindTwoNum(arr,sz);
return 0;
}
以上是关于暑假第十二天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章