zoukankan      html  css  js  c++  java
  • IT公司笔试题总结(四)

    3.技巧题

    试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

    解答:

    int checkCPU()
    {
     {
      union w
      {
       int a;
       char b;
      } c;
      c.a = 1;
      return (c.b == 1);
     }
    }

    剖析:

       嵌入式系统开发者应该对Little-endianBig-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方 式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234Little- endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

    内存地址 存放内容
    0x4000 0x34
    0x4001 0x12

      而在Big-endian模式CPU内存中的存放方式则为:

    内存地址 存放内容
    0x4000 0x12
    0x4001 0x34

      32bit宽的数0x12345678Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

    内存地址 存放内容
    0x4000 0x78
    0x4001 0x56
    0x4002 0x34
    0x4003 0x12

      而在Big-endian模式CPU内存中的存放方式则为:

    内存地址 存放内容
    0x4000 0x12
    0x4001 0x34
    0x4002 0x56
    0x4003 0x78

      联合体union的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写

    试题2写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)

    解答:


     

    int Sum( int n )
    {
      return ( (long)1 + n) * n / 2;  //或return (1l + n) * n / 2;

    }

    剖析:
     
    对于这个题,只能说,也许最简单的答案就是最好的答案。下面的解答,或者基于下面的解答思路去优化,不管怎么折腾,其效率也不可能与直接return ( 1 l + n ) * n / 2相比!

    3.不用第三变量交换两个数
     

    void swap(int a,int b)
    {
        a=a^b;
        b=b^a;
        a=a^b;
    }
    或者
    void swap(int a, int b)
    {
        a=a+b;
        b=a-b;
        a=a-b;
    }
    不过这两种方法只是修改了函数的形参,如果要修改实参,可以采用如下的方法:
    void swap(int* a,int *b)
    {
        *a=*a^*b;
        *b=*b^*a;
        *a=*a^*b;
        printf("In %s:a=%d,b=%d\n",__FUNCTION__,*a,*b);
    }

    4.求大数的阶乘例如100!,使用通常的做法会溢出,这里要使用数组的方法。例如:123*20 相当于 100*20 + 20*20+3*20

    #include <stdio.h>
    int main()
    {
    int n = 1;
    scanf("%d",&n);
    int a[20000];
    int carry;
    int i;
    int digit = 1;
    a[0] = 1;
    int temp;
    for(i = 2; i <= n; ++i)
    {
    carry = 0;
    for(int j = 1; j <= digit; ++j) //digit 大数的位数

    {
    temp = a[j-1] * i + carry;
    a[j-1] = temp % 10;
    carry = temp / 10; //进位

    }
    while(carry)
    {
    a[++digit-1] = carry % 10;
    carry /= 10;
    }
    }
    for(i = digit; i >=1; --i)
    {
    printf("%d",a[i-1]);
    }
    printf("\n");
    n++;
    return 0;
    }

  • 相关阅读:
    suse12安装详解
    Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
    菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
    openstack中dashboard页面RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
    Multiple network matches found for name 'selfservice', use an ID to be more specific.报错
    查看 SELinux状态及关闭SELinux
    SELinux深入理解
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址
    Oracle job procedure 存储过程定时任务
    POI文件导出至EXCEL,并弹出下载框
  • 原文地址:https://www.cnblogs.com/lzjsky/p/1936407.html
Copyright © 2011-2022 走看看