C语言编程题

1、将整形a的第m位赋值到整形b的第n位

int fun4(int a, int m, int b, int n)
{
    a = (a>>m) & 1;//将a的第m位取出,为1或0,故分两种情况

    if(a == 1)//a的第m位为1,即将b的第n位设为1
    {                     
        a = a << n; 
        b =  b | a;       
    }
    else//a的第n位为0,即将b的第n为设为0
    {      
        a = ~(1<<n);
        b = b & a;
    }

    return b;
}
View Code

2、判断一个数是2的几次方

//将2的n次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0,
//因此问题可以转化为判断1后面跟了几个0就可以了。
void log2(int value)
{
    int n = value, count = 0;

    if(n & (n-1))//先判断是否是2的幂次方
    {
        cout << n << "不是2的幂次方" << endl;
        return;
    }

    while(n > 1)
    {
        n >>= 1;
        count++;
    }
    
    cout << value << "是2的" << count << "次方" << endl;
}
View Code

3、判断一个数是否为质数

//质数:在大于1的自然数中,除了1和它本身以外不再有其他因数
bool judge(int n)
{
    if(n <= 1)
        return false;
    else
    {
        for(int i=2; i<n; i++)
        {
            if(n%i == 0)
                return false;
        }
    }

    return true;
}
View Code

4、输出100至1000之间的偶数为哪两个质数的和,如:100=3+97;102=5+97。

void fun6()
{
    for(int i=100; i<=1000; i+=2)
    {
        for(int j=3; j<=i; j++)
        {
            if(judge(j)&&judge(i-j))
        }
    }
}
View Code

5、对整数的十进制显示逐位求和,如13的求和结果为4,-125的求和结果为6

int fun5(int n)
{
    static int flag = 0;//欲求和的数为正还是负的标志
    if(n < 0)
    {
        n = -n;
        flag = 1;
    }

    if(n/10 > 0)//n大于1位
        return n%10 + fun5(n/10);
    else//n为一位数 
    {
        if(flag)
            return -n;
        else
            return n;
    }
}
View Code

6、实现atoi()

int my_atoi(char* pStr)
{
    if (!pStr)
        return 0;
    int iStrLen = strlen(pStr);

    //跳过空格
    int i = 0;
    for (; i < iStrLen; i++)
    {
        if (*(pStr + i) != ' ')
            break;
    }

    //判断正负
    int iSign = 1;
    if ('+' == *(pStr + i))
    {
        ++i;
    }
    else if ('-' == *(pStr + i))
    {
        iSign = -1;
        ++i;
    }

    //转换
    int iNum = 0;
    for (; i < iStrLen; i++)
    {
        char ch = *(pStr + i);
        if (ch >= '0' && ch <= '9')
            iNum = iNum * 10 + (ch - '0');
        else
            break;
    }

    return (iNum * iSign);
}
View Code

7、实现itoa()

char* my_itoa(int iNum, char* pBuf)
{
    if (!pBuf)
        return nullptr;

    //判断正负
    int iSign = 0;
    if (iNum < 0)
    {
        iSign = 1;
        iNum = -iNum;
    }

    //转换
    char* p = pBuf;
    if (iSign)
        *p++ = '-';
    do
    {
        *p++ = iNum % 10 + '0';
        iNum = iNum / 10;
    } while (iNum > 0);
    *p = '';

    //前后互换
    int iStrLen = strlen(pBuf);
    int i = 0;
    int iHalf = iStrLen / 2;
    if (iSign)
    {
        ++iHalf;
        ++i;
    }
    for (; i < iHalf; i++)
    {
        int iRightIdx = 0;
        iSign ? iRightIdx = iStrLen - 1 - i + 1 : iRightIdx = iStrLen - 1 - i;

        char ch = pBuf[i];
        pBuf[i] = pBuf[iRightIdx];
        pBuf[iRightIdx] = ch;
    }

    return pBuf;
}
View Code

8、实现strstr()

/*实现字符串处理strstr():
对pStr逐字与pSubStr比较,eg:
A B C D E F
C D
pStr中第一个就不同,跳过第一个不再考虑

A B C D E F
C D
pStr中第二个也不同,跳过第二个不再考虑

A B C D E F
C D 
pStr中有相同的,进行处理*/

char* MyStrstr(char* pStr, char* pSubStr)
{
    //assert(pStr && pSubStr);

    char*pStrAdvance = pStr;
    while (*pStrAdvance)
    {
        char* p = pStrAdvance, *q = pSubStr;
        while (*p && *q)
        {
            if (*p == *q)
            {
                p++;
                q++;
            }
            else
                break;
        }
        if (!*q)
            return pStrAdvance;

        pStrAdvance++;
    }

    return NULL;
}
View Code

 

原文地址:https://www.cnblogs.com/milanleon/p/5857472.html