PAT:基础编程题目集-函数题6-9,6-10,6-11

6-9 统计个位数字

int Count_Digit ( const int N, const int D )//返回N中D出现的次数
{
    if(N==0&&D==0)
    return 1;
    int ans[10]={0};
    int m=abs(N);//取绝对值
    int x;
    while(m!=0)
    {
        x=m%10;
        m=m/10;
        ans[x]++;
    }
    return ans[D];
}

6-10 阶乘计算升级版

struct bigint
{
    int buf[100];
    int size;
    //初始化
    void init()
    {
        for(int i=0;i<100;i++)
        buf[i]=0;
        size=0;
    }

    //整数变大数
    void set(int x)
    {
        init();
        do
        {
            buf[size++]=x%10000;
            x=x/10000;
        }while(x!=0);
    }

    //大数乘法,重载*
    bigint operator * (int  a) const
    {
        bigint ret;
        ret.init();
        int carry=0;//进位
        for(int i=0;i<size;i++)
        {
            int tmp=buf[i]*a+carry;
            ret.buf[ret.size++]=tmp%10000;
            carry=tmp/10000;
        }

        if(carry!=0)
        ret.buf[size++]=carry;

        return ret;
    }

    //输出
    void output()
    {
        for(int i=size-1;i>=0;i--)
        {
            if(i==size-1)
            printf("%d",buf[i]);
            else
            printf("%04d",buf[i]);
        }

        printf("\n");
    }


}sum;

void Print_Factorial ( const int N )
{
    if(N<0)
    {
        printf("Invalid input");
        return;
    }

    //struct bigint sum;
    sum.init();
    sum.set(1);
    for(int i=1;i<=N;i++)
    sum=sum*i;
    sum.output();
    return;

}

编译有问题,可能是结构体放置的位置不对,可是不太懂怎么修改,难受,有人知道吗

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

  1. 快排解决
void quitsort(ElementType A[], int s,int t);
ElementType Median( ElementType A[], int N )
{
    //快速排序
    quitsort(A,0,N-1);

    if(N%2==0)
    return  A[N/2];
    else
    return  A[(N-1)/2];
}

void quitsort(ElementType A[], int s,int t)
{
    int i=s,j=t;
    ElementType tmp;
    if(s<t)
    {
        tmp=A[s];
        while(i!=j)
        {
            while(j>i&&A[j]>tmp)
            j--;
            A[i]=A[j];
            while(j>i&&A[i]<tmp)
            i++;
            A[j]=A[i];
            A[i]=tmp;
            quitsort(A,s,i-1);
            quitsort(A,i+1,t);
        }
    }

}

最后一个测试点过不了,可能到了快排最坏情况下:每次划分的基准都是最小的。复杂度O(n2)

  1. 归并排序:
#include<stdlib.h>
void merge(ElementType A[], int low,int mid,int high);//每一次二路归并,A[LOW]-A[mid-1]和A[mid]-A[high]
void mergepass(ElementType A[], int length, int n);//对整个表进行一趟归并
void mergesort(ElementType A[], int n);//从单个变两个,从两个变四个并,自底向上二路归并

ElementType Median( ElementType A[], int N )
{
    //快速排序
    mergesort(A,N);

    if(N%2==0)
    return  A[N/2];
    else
    return  A[(N-1)/2];
}

void merge(ElementType A[], int low,int mid,int high)
{
    ElementType *r;
    int i=low,j=mid+1,k=0;

    //给r分配空间
    r=(ElementType *)malloc((high-low+1)*sizeof(ElementType));
    //序排序的两个集合里都还有元素
    while(i<=mid&&j<=high)
    {
        //二路中较小的放入r
        if(A[i]>A[j])
        {
            r[k]=A[j];
            j++;k++;
        }
        else{
            r[k]=A[i];
            i++;k++;
        }
    }

    //剩下的元素放入r
    while(i<=mid)
    {
        r[k]=A[i];
        i++;k++;
    }

    while(j<=high)
    {
        r[k]=A[j];
        j++;k++;
    }

    //r复制进a中
    for(k=0,i=low;i<=high;i++,k++)
    {
        A[i]=r[k];
    }

    free(r);
}

void mergepass(ElementType A[], int length, int n)
{
    int i;
    for(i=0;i+2*length-1<n;i+=2*length)
    merge(A,i,i+length-1,i+2*length-1);

    //处理两个数据数量不等的情况
    if(i+length-1<n)
    merge(A,i,i+length-1,n-1);
}

void mergesort(ElementType A[], int n)
{
    int length;
    for(length=1;length<n;length=2*length)
    mergepass(A,length,n);
}

测试点全部通过,大N卡时21ms

其他的题目太简单了,不用写…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值