算法-用C语言实现

1.交换两个变量的值,不使用第三个变量,即a=3, b=5, 交换后b=3, a=5。
    unsigned char a = 3, b = 5;
    a = a + b; 
    b = a - b; 
    a = a - b; 
或者 
    a = a ^ b; 
    b = a ^ b; 
    a = a ^ b;

如果写成函数:

void swap(int* a, int *b)
{ 
    *a = *a ^ *b; 
    *b = *b ^ *a; 
    *a = *a ^ *b; 
    printf("In %s:a=%d,b=%d\n",__FUNCTION__,*a,*b); 
}

2.如何判别一个数是unsigned?
#define issignal(x) ((x>=0 && ~x>=0) ? 1:0) //为1是无符号 为0有符号
备注:可以直接记住。
    signed最高位只是用来做标记(sign),标记整数的正负,0表示正,1表示负。
    unsigned都是正数,而signed有正数有负数。

3.写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

int checkCPU()
{
    union w
    {
        int a;
        char b;
    } c;
    c.a = 1;

    return (c.b == 1);
}

4.写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)

int Sum(int n)
{
    return ((long)1 + n) * n / 2;//return (1l + n) * n / 2;
}

5.实现x是否为2的若干次幂的判断。

!(X)&(X-1)//为0,不是,否则就是

或者:

int i = 512;
printf("%s\n"(i & (i - 1)) ? false : true);

6.将一整数逆序后放入一数组中(要求递归实现)

void convert(int *result, int n) 
{
    if(n>=10)
        convert(result+1, n/10);
    *result = n%10; 
}

int main(int argc, char* argv[]) {
    int n = 123456789, result[20]={};
    convert(result, n);
    printf("%d:", n);
    for(int i=0; i<9; i++)
        printf("%d", result[i]);

    return 0;
}

7.

你可能感兴趣的:(c语言自写函数系列)