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;
}
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;
}
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;
}
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))
}
}
}
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;
}
}
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);
}
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 = '\0';
//前后互换
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;
}
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;
}