• PTA基础编程题目集(四)(直接插入排序、希尔排序、大数阶乘、6-10 阶乘计算升级版、6-11 求自定类型元素序列的中位数)


    直接插入排序:

    https://www.cnblogs.com/skywang12345/p/3596746.html

    /*
     * 快速排序
     *
     * 参数说明:
     *     a -- 待排序的数组
     *     l -- 数组的左边界(例如,从起始位置开始排序,则l=0)
     *     r -- 数组的右边界(例如,排序截至到数组末尾,则r=a.length-1)
     */
    void quick_sort(int a[], int l, int r)
    {
        if (l < r)
        {
            int i,j,x;
    
            i = l;
            j = r;
            x = a[i];
            while (i < j)
            {
                while(i < j && a[j] > x)
                    j--; // 从右向左找第一个小于x的数
                if(i < j)
                    a[i++] = a[j];
                while(i < j && a[i] < x)
                    i++; // 从左向右找第一个大于x的数
                if(i < j)
                    a[j--] = a[i];
            }
            a[i] = x;
            quick_sort(a, l, i-1); /* 递归调用 */
            quick_sort(a, i+1, r); /* 递归调用 */
        }
    }  

    希尔排序:

    https://www.cnblogs.com/skywang12345/p/3597597.html

    /*
     * 希尔排序
     *
     * 参数说明:
     *     a -- 待排序的数组
     *     n -- 数组的长度
     */
    void shell_sort1(int a[], int n)
    {
        int i,j,gap;
    
        // gap为步长,每次减为原来的一半。
        for (gap = n / 2; gap > 0; gap /= 2)
        {
            // 共gap个组,对每一组都执行直接插入排序
            for (i = 0 ;i < gap; i++)
            {
                for (j = i + gap; j < n; j += gap) 
                {
                    // 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
                    if (a[j] < a[j - gap])
                    {
                        int tmp = a[j];
                        int k = j - gap;
                        while (k >= 0 && a[k] > tmp)
                        {
                            a[k + gap] = a[k];
                            k -= gap;
                        }
                        a[k + gap] = tmp;
                    }
                }
            }
    
        }
    }

    6-11 求自定类型元素序列的中位数 (25分)

    https://pintia.cn/problem-sets/14/problems/743

    思路:第一次用冒泡,超时;后用希尔,过了。

    ElementType Median(ElementType A[],int N)
    {
    	int i,j,gap;
        int n=N;
        // gap为步长,每次减为原来的一半。
        for (gap = n / 2; gap > 0; gap /= 2)
        {
            // 共gap个组,对每一组都执行直接插入排序
            for (i = 0 ;i < gap; i++)
            {
                for (j = i + gap; j < n; j += gap) 
                {
                    // 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
                    if (A[j] < A[j - gap])
                    {
                        double tmp = A[j];
                        int k = j - gap;
                        while (k >= 0 && A[k] > tmp)
                        {
                            A[k + gap] = A[k];
                            k -= gap;
                        }
                        A[k + gap] = tmp;
                    }
                }
            }
    
        }
        return A[n/2];
    } 

    求大数阶乘:

    // 1000 的阶乘 2568 位  
    #include <stdio.h>  
      
    int a[3000];  
      
    void show(int k)  
    {  
        int i=0;  
        printf("位数 %d 位
    ",k);  
        for (i=k-1; i>=0; i--)  
        {  
            printf("%d",a[i]);  
        }  
    }  
      
    int fanc(int n)  
    {  
        int w=0;  
        int i=0, j=0;  
        int t=n;  
        int k=0;    // 表示数据的位数。    
        while(t)  
        {  
            a[i++] = t%10;  
            t/=10;  
            k++;  
        }  
      
        for (j=n-1; j>1; j--)  
        {  
            w=0;    // 表示进位  
            for (i=0; i<k; i++)  
            {  
                t = a[i]*j+w;  
                a[i] = t%10;  
                w = t/10;  
            }  
      
            while(w)  
            {  
                a[i++] = w%10;  
                w/=10;  
                k++;  
            }  
        }  
        return k;  
    }   
    int main()  
    {  
        int n;  
        int k=0;  
      
        scanf("%d",&n);  
        k = fanc(n);  
        show(k);  
        printf("
    ");  
        return 0;  
    } 

    6-10 阶乘计算升级版 (20分)

    https://pintia.cn/problem-sets/14/problems/742

    思路:大数阶乘

    代码:

    void Print_Factorial(const int N)
    {  
        int n=N;
        int a[3000]; 
        int w=0;  
        int i=0, j=0;  
        int t=n;  
        int k=0;    // 表示数据的位数。    
        if(n<0) printf("Invalid input
    ");
        else if(n==0) 
        {
        	printf("1
    ");
    	}
        else if(n>0){
        while(t)  
        {  
            a[i++] = t%10;  
            t/=10;  
            k++;  
        }  
      
        for (j=n-1; j>1; j--)  
        {  
            w=0;    // 表示进位  
            for (i=0; i<k; i++)  
            {  
                t = a[i]*j+w;  
                a[i] = t%10;  
                w = t/10;  
            }  
      
            while(w)  
            {  
                a[i++] = w%10;  
                w/=10;  
                k++;  
            }  
        }  
        //return k; 
    	int s=0;  
        //printf("位数 %d 位
    ",k);  
        for (s=k-1; s>=0; s--)  
        {  
            printf("%d",a[s]);  
        }
    	printf("
    ");  
        }
    }  
    

      

    天晴了,起飞吧
  • 相关阅读:
    前端常见跨域解决方案
    VS单元测试--初级篇
    高等数学思路
    二元函数求极值判别式AC-B^2
    向量积详解
    伯努利分布均值和方差
    两个标准正态随机变量相乘的方差
    a分位数与双侧a分位数
    中心极限定理概念理解与记忆
    样本方差概念解析
  • 原文地址:https://www.cnblogs.com/jianqiao123/p/12041652.html
Copyright © 2020-2023  润新知