1、输入一个数,判断其是否为素数
bool JudgePrimeNumber(int iN)
{
for (int i=2; i<=sqrt(iN);i++)
{
if (iN%i == 0)
return false;
}
return true;
}
2、实现库函数类型题目
(1) 实现C语言库函数atoi
bool myatoi(const char* strNum, int & iNum)
{
int iFlag = 0;
if (strNum == NULL){ //判断输入是否合法
return false;
}
bool bMinus=0; //判断是否有符号
if (*strNum == '+'){
strNum++;
}else if(*strNum == '-'){
strNum++;
bMinus = 1;
}
while (*strNum != '\0') //开始转换
{
if (*strNum >= '0' && *strNum <='9')
{
iNum = iNum*10 + (*strNum -'0');
if (iNum > 4294967296){
iFlag = 1; //判断是否溢出
break;
}
}else{ //遇到非法字符,停止转换
iFlag = 1;
break;
}
strNum++;
}
if (iFlag == 0){
if (bMinus){
iNum = 0-iNum;
}
return true;
}else{
return false;
}
}
(2) 实现C语言库函数itoa
char* myitoa(char* strNum, int iNum)
{
iNum < 0 ?iNum = -iNum: iNum = iNum;
int iSize = 1;
int iNumT = iNum;
while (iNumT/10){
iSize = iSize*10;
iNumT /= 10;
}
char szTemp[20];
int iPos = 0;
while (iSize>=1){
szTemp[iPos++] = iNum/iSize+'0';
iNum %= iSize;
iSize /= 10;
}
szTemp[iPos] = '\0';
if (iNum < 0 ){
strNum[0] = '-';
strcpy(strNum+1,szTemp);
}else{
strcpy(strNum,szTemp);
}
return strNum;
}
(3) 实现C语言库函数strstr
const char * mystrstr(const char* str, const char * substr)
{
if (NULL == str || NULL == substr)
return NULL;
for (int iCount=0; str[iCount] != '\0'; iCount++)
{
int iPos = iCount;
int jPos = 0;
while(str[iPos++] == substr[jPos++]){
if (substr[jPos] == '\0'){
return &str[iCount];
}
}
}
return NULL;
}
(4) 实现C语言库函数strcpy,返回des_str的目的是为了实现链式表达。
char* strcpy(char* des_str, const char* src_str)
{
if (NULL == des_str || NULL == src_str){
return NULL;
}
char *des= des_str;
while ((*des++ = *src_str++) != '\0')
;
return des_str;
}
3、用一个表达式,判断一个数X是否是2^N,不用循环语句。
答案为:!(X & (X-1)),若X是2^N,则其对应的二进制中只有一个1,因此X & (X-1)进行位运算后,结果为0。与该题目类似的题目是,判断一个正整数的二进制中1的个数。
int main()
{
int i= 9999;
int iCount = 0;
while(i){
iCount++;
i = i & (i-1);
}
printf("%d\n",iCount);
return 0;
}
如下代码中,X & Y相当于取X和Y的相同位,X^Y相当于取X和Y的不同位,左移相当于除2,
于是(X&Y)+((X^Y)>>1)就等价于求X和Y的均值。
int main()
{
int X = 729;
int Y = 271;
int Z = (X&Y) + ((X^Y)>>1);
printf("Z=%d\n",Z); // 500
return 0;
}
4、交换和比较
(1) 不用if, ?:, switch或其他判断语句,找出两个数之间的较大的数
int maxnum = (a+b+abs(a-b))/2; //找出两个数之间较大的数
int minmun = (a+b-abs(a-b))/2; //找出两个数之间较小的数
(2) 不使用第三个数,交换a和b的值
//方法 1
a = a+b;
b = a-b;
a = a-b;
//方法 2
a = a^b;
b = a^b;
a = a^b;