嵌入式C笔试题[转]

1、整数求反

如123456求反之后变654321

思路:定义两个变量,一个变量保存原来的数,另外一个保存取反之后的数。然后利用对10求余的方法将要取反的数的最低位首先取出来,然后利用除法(除以10)将最低位去掉。利用num>0不断的循环一位一位的取出来即可。

关键:***对10求余是取出最低位***

            ***除以10是去除最低位***

int main(void)
{
    int num = 123456;
    int r_num = 0;
    while(num > 0)
    {
        r_num = r_num*10 + (num%10);
        num = num/10;
    }

    printf("%d\n", r_num);
}

2、字符串求反(逆序)

思路1:先算出字符串的长度,然后记录中间的位置,循环交换第一个字符和最后一个字符

思路2:函数接口设计成要char *ReverseString(char *s, int start, int end)

char *ReverseString(char *s)
{
    if(s == NULL)
    {
        return s;
    }

    int len = strlen(s);
    int i = 0;
    char temp;
    for(i=0; i<len/2; i++)
    {
        temp = s[i];
        s[i] = s[len-1-i];
        s[len-1-i] = temp;
    }

    return s;
}
char *ReverString(char *str, int start, int end)
{
    if(str == NULL)
    {
        return str;
    }

    cahr temp;
    while(start < end)
    {
        temp = str[start];
        str[start] = str[end];
        str[end] = temp;
        start++;
        start--;
    }
    return str;
}

3、递归求n的阶乘

思路:注意递归结束的条件即可

int recursion(int n)
{
     if(n <= 0)
    {
        return 0;
    }
    else if(n == 1)
    {
        return 1;
    }
    else
    {
         n= n*recursion(n-1)
    }
    return  n;
}

4、不用库函数比较两个字符串的大小

int strcmp(const char*src, const char *dst)
{
    if(src==NULL || dst==NULL)
    {
        return -1;
    }
    
    while(*src && *dst && *src==*dst)
    {
        src++;
        dst++;
    }
    
    return *src-*dst;
}

5、写一个程序读入一个文件判断文件中字母a的个数

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp = NULL;    
    char ch;
    int count = 0;
     //打开文件
    fp = open("test.txt", "r");
    if(fp == NULL)
    {
        printf("oepn error\n");
        return -1;
    }
   
    //循环读取文件的字符
    while((ch = fgetc(fp)) != EOF)
    {
        if(ch == 'a')
        {
            count++;
        }
    }
    printf("%d\n", count);
    //关闭文件
    close(fp);
    return 0;
}

6、求0--3000中含有9和2的全部数之和

思路:从29循环到3000,然后将每个数转换成字符串,写一个函数检测这个字符串有没有含有‘9’,‘2’的字符,如果含有则返回1

没有则返回0,如果成立则将此数叠加起来。

需要的函数:数字转字符串的函数char * myitoa(char *buf, int num, int radix)

char *myitoa(int num, char *str, int radix)
{
    char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int temp;
    int i = 0, j, k;
    if(radix==10 && num<0)
    {
        temp = -num;
        str[i++] = '-';
    }
    else
    {
        temp = num;
    }
    while(temp)
    {
        str[i++] = index[temp%radix];
        temp = temp/radix;
    }
    str[i] = '\0';

    /*转换*/
    if(str[0] == '-')
        k = 1;
    else
        k = 0;

    char temp1;
    for(j=k; j<=(i-k-1)/2; j++)
    {
        temp1 = str[j];
        str[j] = str[i-j-1];
        str[i-j-1] = temp;
    }

    return str;
}
#include <stdio.h>

char *myitoa(int num, char *str, int radix)
{
    char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int temp;
    int i = 0, j, k;
    if(radix==10 && num<0)
    {
        temp = -num;
        str[i++] = '-';
    }
    else
    {
        temp = num;
    }
    while(temp)
    {
        str[i++] = index[temp%radix];
        temp = temp/radix;
    }
    str[i] = '\0';

  /*
    if(str[0] == '-')
        k = 1;
    else
        k = 0;

    char temp1;
    for(j=k; j<=(i-k-1)/2; j++)
    {
        temp1 = str[j];
        str[j] = str[i-j-1];
        str[i-j-1] = temp;
    }*/

    return str;
}

void* mymemset(void *str, int val, unsigned int n)
{
    if(str == NULL)
    {
        return;
    }
    void *temp = str;
    while(n-->0)
    {
        *(char *)str = (char)val;
        str = (char *)str + 1;
    }
    return temp;
}

int test29(const char *buf)
{
    if(buf == NULL)
    {
        return -1;
    }
    int flag_2 = 0, flag_9 =0;
    while(*buf != '\0')
    {
        if(*buf == '2')
        {
            flag_2 = 1;
        }
        if(*buf = '9')
        {
            flag_9 = 1;
        }
        buf++;
    }
    if(flag_2 && flag_9)
    {
        return 1;
    }
    return 0;
}

int main(void)
{
    int sum = 0;
    int num = 29;
    char str[5];
    mymemset(str, 0, 5);
    for(num=29; num<=3000; num++)
    {
        //将数字转化成字符串
        myitoa(num, str, 10);
        if(test29(str))
        {
            sum = sum + num;
            printf("%d\n", num);       
        }
       
    }
    printf("%d\n",sum);
    
}

7、十进制转化成任意进制

思路:十进制数X转化成M进制,方法:从X开始循环求余M,记下余数,X再除以M,再利用X除以M的商作为新的X继续求余M,知道X=0为止。然后倒序取余数即可。

void tans10_to_other(char *buf, int num, int radix)
{
    if(buf == NULL)
    {
        return;
    }
    char r;
    while(num > 0)
    {
        r = num % radix;
        if(r > 10)
        {
            *buf = r + '0';
        }
        else
        {
            *buf = r + 'A';
        }
        num = num / radix;
        buf++;
    }
    *buf = '\0';
}

8、判断一个数是否是2的n次方(==符号的优先级高于&)

int fun(int x)
{
    return ((x&(x-1))==0)? 1 : 0;
}

9、统计一个数的1的个数

int CountOne(int x)
{
    int count = 0;
    while(x)
    {
        count++;
        x &= (x-1);
    }

    return count;
}

10、判断机器的大小端

/*返回1:大端
 *返回0:小端
 */
int Testendian(void)
{
    union endian
    {
        unsigned int a;
        unsigned char b;
    }x;
    
    x.a = 1;
    return x.b==1? 0 : 1;
}
int TestEndian(void)
{
    unsigned int a = 0x12345678;
    char *p = (char*)&a;
    return ((*p)==1)? 0 : 1;
}

9、typedef int(*CallBack)(char *p);

分析:

1、CallBack是变量名

2、*CallBack:CallBack是一个指针

3、int是函数返回值的类型char*p是函数参数的类型,所以这个函数指针指向一个类型为Int fun(char *)的函数

4、利用typedef令CallBack是这种类型的别名

/*声明一个函数指针*/

CallBack my_callback1;

10、字符串转化成整形数

int myatoi(const char *p)
{

    if(p == NULL)    
    {
        return 0;
    }

    int num = 0;
    int Minus = 1;

    if(*p == '-')
    {
        Minus = -1;
        p++;
    }
    else
    {
        Minus = 1;
    }

    char *temp = p;
    while(*temp>'9' || *temp<'0')
    {
        return 0;
    }

    while(*p != '\0')
    {
        num = num * 10 + *p - '0';
        p++;
    }

    num *= Minus;
    return num;
}

11、二分法查找

int binary(int *arry, int len, int goal)
{
    int low = 0;
    int high = len-1;
    int middle;
    while(low < high)
    {
        middle = low + (high-low)/2;

        if(arry[middle] = goal)
        {
            return middle;
        }
        else if(arry[middle] > goal)
        {
            high = middle;
        }
        else
        {
            low = middle;
        }
    }
    return -1;
}

12、将一个四位数的整数编码,编码方法:将每一位数都加上5,结果除10,所得余数取代该位数,最后第一个位和第四位交换,第二位和第三位交换。返回编码后的结果(int)。例如1234的编码结果返回9876.

思路:一般设计到数字的编程都要用到求余和除法。一个四位数对10求余可得到个位。对100求余可得到一百以下的那个数,然后除以10获得的商就可得十位。对1000求余得到1000一下的那个数,再除以100获得的商即是百位。要获得千位直接除以1000即可。然后利用一个数组存储起来每一位加上五,再求余十。

int Code(int num)
{
    int a[4];
    int i = 0;
    int n = num;
    int sum = 0;
    for(i=0; i<4; i++)
    {
        a[i] = n%10;
        n /= 10;
    }
    for(i=0; i<4; i++)
    {
        a[i] += 5;
        a[i] %= 10;
        sum = sum*10 + a[i];
    }

    return  sum;
}

13、利用2、4、6、8四个数用加减乘除计算出23。(每个数字只能用一次)

4*(6-(2/8))

猜你喜欢

转载自blog.csdn.net/wllen_/article/details/81213755