double pow(double base, int exponent)
pow函数:计算$ base^{exponent} $次方,需要注意y正负号,和效率问题。
#include<iostream>
#include<vector>
using namespace std;
double getResult(double base, int exponent) {
if(exponent==1) return base;
if(exponent==0) return 1;
double res=getResult(base, exponent>>1);
res *= res;
if((exponent&1)==1) res = res*base; //当指数为奇数时,要乘上base
return res;
}
double power(double base, int exponent) {
if(base==0) return 0; //底为0的时候特殊处理
bool isNegetive=false; //判断指数是否为负
if(exponent<0) {
isNegetive = true;
exponent=-exponent;
}
double result = getResult(base, exponent); // 递归处理,减少运算次数
if(isNegetive) return 1/result;
else return result;
}
int main(){
cout<<power(2, -3)<<endl;
return 0;
}
void memcpy(void *dest, void *sour, int length)
memcpy函数:将sour的内容拷贝到dest中,需要注意内存的重叠问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void my_memcpy(char *dest,const char * sour,int len)
{
char * dst = NULL;
const char * src = NULL;
if (dest>=sour+len || dest<=sour){
dst = dest;
src = sour;
while (len--) *dst++ = *src++;
}else{
dst = dest + len-1;
src = sour + len-1;
while (len--) *dst-- = *src--;
}
return;
}
int main()
{
/* 内存不重叠情况*/
char *source = "didi_Test";
int len = strlen(source);
printf("len = %d
",len);
char *dest = NULL;
dest = (char *)malloc(sizeof(char)*(len+1));
printf("source = %p , dest = %p
",source,dest);
memset(dest,0,len+1);
my_memcpy(dest,source,len+1);
printf("%s
",dest);
printf("-----------------------------------------------------------
");
/* 内存重叠情况*/
char comm_src[50] = "This is memcpy test";
char *comm_dst = comm_src+10;
printf("comm_str = %p , comm_dst = %p
",comm_src,comm_dst);
printf("comm_dst - comm_str = %ld
",comm_dst - comm_src);
int comm_len = strlen(comm_src);
printf("len = %d
",comm_len);
my_memcpy(comm_dst,comm_src,comm_len+1);
printf("%s
",comm_dst);
printf("%s
",comm_src);
}
atoi()函数
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<assert.h>
_Bool tmp_flag = 0;//判断字符串转换来的数字是否合法 0表示不合法,1表示合法
int my_atoi(const char*src)
{
long long ret = 0;
int flag = 1;//判断这个字符串转为的数字的正负性。1表示整数,-1表示复数
assert(src != NULL);//断言src是否为空指针
while (isspace(*src))//跳过前面的空格
{
src++;
}
if (*src == '-' || *src == '+')
{
if (*src == '-')
flag = -1;
src++;//判断完之后一定要向后偏移一个字节。
}
while ((*src) && isdigit(*src))//判断字符是不是数字字符
{
tmp_flag = 1;//如果是数字字符,把tmp_flag赋值为真
if (INT_MAX<ret || INT_MIN>ret)//如果转化的结果大于整型最大值或小于整型最新值,就不在往后继续判断,跳出循环
{
break;
}
ret = ret * 10 + flag*(*src - '0');//把字符串数字转化为整型
src++;//计算完之后,向后偏移一个字节
}
if (*src)//判断字符串是是否还有非数字字符
{
tmp_flag = 0;//如果还有非数字字符,把tem_flag赋值为假。
}
return (int)ret;
}
int main()
{
printf("请输入数字字符串:");
char pc[20] = { 0 };
scanf("%s", pc);
int ret = my_atoi(pc);
printf("%d
", atoi(pc));
if (tmp_flag)//当字符串为合法字符串时,则输出转化后的结果。
printf("%d
", ret);
system("pause");
return 0;
}