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; }
(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;