程序员面试笔试题目-素数、atoi、itoa、strstr、strcpy以及两个数交换(一)

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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值