暑假第十二天之每天一些题系列

暑假第十二天之每天一些题系列

一、选择题

  • 定义了一维 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小赵小赵福星高照~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值