C语言 基础60题(3)

发布时间:2019-09-19 08:04:20编辑:auto阅读(1569)

    第17题
    int sum_nth(unsigned int num, unsigned int n);
    功  能:求出给定自然数的指定位置的数字(个位为0,十位为1,......)
    参  数:num为给定的自然数;n为指定位置.
    返回值:>=0,给定自然数的指定位置的数字; <0,不成功.
    分  值:

    //第17题
    int sum_nth(unsigned int num,unsigned int n){
        if(num>=0){
            unsigned int i;
            if(num>10){
                for(i=1;i<=n;i++){
                    num=num/10;
                    if(num<10 && (n-i)>0)
                        return -1;
                } 
            }
            num=num%10;
            return num;
        }else{
        return -1;
        }
    }

    第18题
    int sum_square(unsigned int num);
    功  能:求出给定自然数的各位数字的平方和(例如 自然数1234的各位数字的平方和为30)
    参  数:num为给定的自然数.
    返回值:>=0,给定自然数的各位数字的平方和;<0,不成功.
    分  值:

    //第18题
    int sum_square(unsigned int num){
        int sum=0;
        int temp;
        while(num>10){
            temp=num%10;
            sum=sum+temp*temp;
            num=num/10;
        }
        sum=sum+num*num;
        return sum;
    }

    第19题
    int sort_acend(double* array, unsigned int n);
    功  能:对给定数组中的数按升序排序
    参  数:array为给定的数组;n为数组中元素的个数.
    返回值:>=0,成功排序; <0,不成功.
    分  值:

    //第19题
    //使用选择排序算法
    int sort_ascend(double *arry, unsigned int n){
        unsigned int i,k;
        unsigned int lowIndex;
        for(i=0;i<n;i++){
            lowIndex=i;
            for(k=i+1;k<n;k++){
                if(*(arry+k)<*(arry+i))
                    lowIndex = k;
            }
            double temp=*(arry+i);
            *(arry+i)=*(arry+lowIndex);
            *(arry+lowIndex)=temp;
        }
    
        bool flag1=true;
        for(i=0;i<n-1;i++){
            if(*(arry+i)<*(arry+i+1) && flag1){
                flag1=true;
            }else{
                flag1=false;
            }
        }
        
        if(flag1)
            return 1;
        return -1;
    }

    第20题
    int sort_decend(double* array, unsigned int n);
    功  能:对给定数组中的数按降序排序
    参  数:array为给定的数组;n为数组中元素的个数.
    返回值:>=0,成功排序; <0,不成功.
    分  值:

    //第20题
    //插入排序算法
    int sort_descend(double *arry, unsigned int n){
        unsigned int i,k;
        for(i=1;i<n;i++){
            for(k=i;k>0;k--){
                if(*(arry+k)>*(arry+k-1)){
                    double temp=*(arry+k);
                    *(arry+k)=*(arry+k-1);
                    *(arry+k-1)=temp;
                }    
            }
        }
        bool flag1=true;
        for(i=0;i<n-1;i++){
            //printf("\n%.2f\n",*(arry+i));
            if(*(arry+i)>*(arry+i+1) && flag1){
                flag1=true;
            }else{
                flag1=false;
            }
        }
        
        if(flag1)
            return 1;
        return -1;
    }

    第21题
    int search_bin(int* array, unsigned int n, int value);
    功  能:用二分检索法(也称折半法,字典法等)找出给定数值在数组中位置的下标值
    参  数:array为给定的数组;n为数组中元素的个数; value为要查找的数值.
    返回值:>=0, 给定数值在数组中位置的下标; <0,未找到.
    分  值:

    //第21题
    //二分检索法
    int search_bin(int* array, unsigned int n, int value){
        
        int low=0,high=n-1,mid;//置当前查找区间上、下界的初值
        while(low<=high){
            if(*(array+low)==value)
                return low;
            if(*(array+high)==value)
                return high;
            //当前查找区间array[low..high]非空
            mid=low+((high-low)/2);
            //使用(low+high)/2会有整数溢出的问题
            if(*(array+mid)==value)
                return mid;//查找成功返回
            if(*(array+mid)<value)
                low=mid+1;//继续在array[mid+1..high]中查找
            else
                high=mid-1;//继续在array[low..mid-1]中查找
         
        }
        if(low>high)
            return-1;//当low>high时表示所查找区间内没有结果,查找失败
    }

    第22题
    unsigned int factorial(unsigned int n);
    功  能:求给定自然数的阶乘。
    参  数:n为给定的自然数.
    返回值:给定数的阶乘n!.
    分  值:

    //第22题
    
    unsigned int factorial(unsigned int n){
        if(n==0||n==1){
            return 1;
        }else{
            return n*factorial(n-1);
        }
    
    }

    第23题
    char*   strn2b(unsigned int n);
    功  能:求出给定自然数的二进制字符串表示(例如,5的二进制字符串表示为“101”)
    参  数:n为给定的自然数.
    返回值:二进制字符串数组的首地址.
    分  值:

    //第23题
    char*   strn2b(unsigned int n){
         char arr[32]={};//因为是无符号整数,所以二进制表示最长为32位
        for(int i=31;i>=0;i--){
            if((n & 0x1)==1){
                arr[i]='1';
            }else{
                arr[i]='0';
            }
            n=(n>>1);
        }
    
        return arr;
    }


关键字