暑假第十二天之每天一些题系列
一、选择题
答案解析:
a[10]越界访问了,10个元素下标是0-9。
答案解析:
动态开辟的数组在运行时确定大小
答案解析:
数组的下标为0-9,a[10]已经越界访问了
答案解析:
*(a+i)+j表示的是a[i][j]的地址,需要对它再解引用才是a[i][j]
答案解析:
数组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
答案解析:
循环体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;
}
}
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;
}
|