PAT : 基础编程题目集_函数题答案(6-1 ~ 6-13)(纯C编写)

水题使我快乐_(:зゝ∠)_ 

 半个暑假过去了,是时候刷点水题恢复一下了,哈哈哈。

题目地址

总结:1~9,12~13水题;10大数乘法,11希尔排序或归并排序等(除快速排序)

6-1

void PrintN(int N)
{
    int x = 1;
    while (x <= N)
        printf("%d\n", x++);
}

6-2

double f( int n, double a[], double x )
{
  double ans = 0.0;
  int z = 0;
  double y = 1.0;
  for(;z<=n;z++,y*=x)
    ans += a[z]*y;
  return ans;
}

6-3

int Sum(int List[], int N)
{
    int x = 0;
    int sum = 0;
    while (x < N)
        sum += List[x++];
    return sum;
}

6-4

ElementType Average(ElementType S[], int N)
{
    ElementType sum = 0;
    int x = N;
    while (N)
        sum += S[--N];
    return sum / x;
}

6-5

ElementType Max(ElementType S[], int N)
{
    ElementType M = S[N - 1];
#define Max(a, b) (a > b ? a : b)
    while (N--)
        M = Max(S[N], M);
#undef Max(a, b)
    return M;
}

6-6

int FactorialSum(List L)
{
    int sum = 0;
    while (L != NULL)
    {
        int x, y;
        for (x = 1, y = 1; x <= L->Data; x++)
            y *= x;
        sum += y;
        L = L->Next;
    }
    return sum;
}

6-7

int IsTheNumber(const int N)
{
#include <math.h>
    double sq = sqrt(N);
    if (sq - (int)sq)
        return 0;
    else
    {
        int num = N;
        int dig[10] = {0};
        while (num)
        {
            int x = num % 10;
            num /= 10;
            dig[x]++;
            if (dig[x] > 1)
                return 1;
        }
    }
    return 0;
}

6-8

int Factorial(const int N)
{
    if (!N)
        return 1;
    if (N < 0)
        return 0;
    int x = N, y = N;
    while (--y)
        x *= y;
    return x;
}

6-9

int Count_Digit(const int N, const int D)
{
    if (!N && !D)
        return 1;
    int num = abs(N), cnt = 0;
    while (num)
    {
        int x = num % 10;
        num /= 10;
        if (x == D)
            cnt++;
    }
    return cnt;
}

特殊情况:N和D都是0的时候,输出应为1。

6-10

void Big_multiplication(int *a, int *b, int *result);
void Print_Factorial(const int N)
{
    if (!N || N == 1)
    {
        printf("1\n");
        return;
    }
    if (N < 0)
    {
        printf("Invalid input\n");
        return;
    }
    int num1[10] = {1, 1};
    int num2[3000] = {1, 2};
    int mul[3000];
    Big_multiplication(num1, num2, mul);
    int i;
    for (i = 3; i <= N; i++)
    {
        int x = i, y = 1, j;
        while (x)
        {
            num1[y] = x % 10;
            x /= 10;
            y++;
        }
        num1[0] = y - 1;
        for (j = 0; j <= mul[0]; j++)
            num2[j] = mul[j];
        Big_multiplication(num1, num2, mul);
    }
    for (i = mul[0]; i >= 1; i--)
        printf("%d", mul[i]);
    printf("\n");
    return;
}
void Big_multiplication(int *a, int *b, int *result)
{
    for (int i = 0; i < 3000; i++)
        result[i] = 0;
    int i = 1;
    while (i <= b[0])
    {
        int j = 1;
        while (j <= a[0])
        {
            result[i + j - 1] += a[j] * b[i];
            j++;
        }
        i++;
    }
    i = 1;
    while (result[i] || i <= b[0] + a[0] - 1)
    {
        result[i + 1] += result[i] / 10;
        result[i] = result[i] % 10;
        i++;
    }
    result[0] = i - 1;
}

这是个大数乘法题,1000的阶乘位数达到两千多位,必须用数组存储结果。

这里用的是模拟乘法运算的方法,数组【0】存放此数组数的总位数,先不管是否进位,计算出结果每一位,最后从最低位往高位逐位进位处理。

注意特殊情况:负数时输出Invalid input,0时输出1。
6-11

这道题用冒泡、选择和插入排序都是不行的,最后一个测试点时间超限。于是测试了快速排序、希尔排序和归并排序。

期望很高的快速排序竟然也超时了,然而希尔排序和归并排序都成功通过测试。我想最后一个测试点应该卡的就是快速排序的最坏情况。

ElementType Median(ElementType A[], int N)
{
    int i, j, x;
    ElementType temp;
    for (x = N / 2; x > 0; x /= 2)
    {
        for (i = x; i < N; i++)
        {
            temp = A[i];
            for (j = i; j >= x; j -= x)
                if (temp < A[j - x])
                    A[j] = A[j - x];
                else
                    break;
            A[j] = temp;
        }
    }
    return A[N / 2];
}

采用希尔排序,最后一个测试点能通过(36ms左右)。

#include <stdlib.h>
void merge(ElementType A[], ElementType temp[], int lops, int rops, int rightend)
{
    int i, leftend, sum, tempos;
    leftend = rops - 1;
    tempos = lops;
    sum = rightend - lops + 1;
    while (lops <= leftend && rops <= rightend)
        if (A[lops] <= A[rops])
            temp[tempos++] = A[lops++];
        else
            temp[tempos++] = A[rops++];
    while (lops <= leftend)
        temp[tempos++] = A[lops++];
    while (rops <= rightend)
        temp[tempos++] = A[rops++];
    for (i = 0; i < sum; i++, rightend--)
        A[rightend] = temp[rightend];
}
void mersort(ElementType A[], ElementType temp[], int left, int right)
{
    if (left < right)
    {
        int x = (left + right) / 2;
        mersort(A, temp, left, x);
        mersort(A, temp, x + 1, right);
        merge(A, temp, left, x + 1, right);
    }
}
ElementType Median(ElementType A[], int N)
{
    ElementType *temp;
    temp = (ElementType *)malloc(N * sizeof(ElementType));
    mersort(A, temp, 0, N - 1);
    free(temp);
    return A[N / 2];
}

采用归并排序,最后一个测试点能通过(39ms左右)。

6-12

int even( int n )
{
  if(n%2)
    return 0;
  return 1;
}


6-13

int  Search_Bin(SSTable T, KeyType k)
{
  int left,right;
  left=1,right=T.length;
  while(left<=right)
  {
    KeyType x = T.R[(left+right)/2].key;
    if(x==k)
      return (left+right)/2;
    if(x>k)
      right=(left+right)/2-1;
    else
      left=(left+right)/2+1;
  }
  return 0;
}

 

简单的二分查找

END

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
REGISTER ADDRESS REGISTER DATA(1) HEX 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 LVDS_ RATE_2X 0 0 0 0 0 0 0 0 0 0 0 0 0 GLOBAL_ PDN 2 PAT_MODES_FCLK[2:0] LOW_ LATENCY_E N AVG_EN SEL_PRBS_ PAT_ FCLK PAT_MODES SEL_PRBS_ PAT_GBL OFFSET_CORR_DELAY_FROM_TX_TRIG[5:0] 3 SER_DATA_RATE DIG_GAIN_ EN 0 OFFSET_CORR_DELAY _FROM_TX_TRIG[7:6] DIG_ OFFSET_ EN 0 0 0 1 0 0 0 0 4 OFFSET_ REMOVA L_SELF OFFSET_ REMOVAL_ START_ SEL OFFEST_ REMOVAL_ START_ MANUAL AUTO_OFFSET_REMOVAL_ACC_CYCLES[3:0] PAT_ SELECT_ IND PRBS_ SYNC PRBS_ MODE PRBS_EN MSB_ FIRST DATA_ FORMAT 0 ADC_RES 5 CUSTOM_PATTERN 7 AUTO_OFFSET_REMOVAL_VAL_RD_CH_SEL 0 0 0 0 0 0 0 0 0 0 CHOPPER_EN 8 0 0 AUTO_OFFSET_REMOVAL_VAL_RD B 0 0 0 0 EN_ DITHER 0 0 0 0 0 0 0 0 0 0 0 D GAIN_ADC1o 0 OFFSET_ADC1o E GAIN_ADC1e 0 OFFSET_ADC1e F GAIN_ADC2o 0 OFFSET_ADC2o 10 GAIN_ADC2e 0 OFFSET_ADC2e 11 GAIN_ADC3o 0 OFFSET_ADC3o 12 GAIN_ADC3e 0 OFFSET_ADC3e 13 GAIN_ADC4o 0 OFFSET_ADC4o 14 GAIN_ADC4e 0 OFFSET_ADC4e 15 PAT_PRB S_LVDS1 PAT_PRBS_ LVDS2 PAT_PRBS_ LVDS3 PAT_PRBS_ LVDS4 PAT_LVDS1 PAT_LVDS2 HPF_ ROUND_ EN_ADC1-8 HPF_CORNER_ADC1-4 DIG_HPF_ EN_ADC1-4 17 0 0 0 0 0 0 0 0 PAT_LVDS3 PAT_LVDS4 0 0 18 0 0 0 0 PDN_ LVDS4 PDN_ LVDS3 PDN_ LVDS2 PDN_ LVDS1 0 0 0 0 INVERT_ LVDS4 INVERT_ LVDS3 INVERT_ LVDS2 INVERT_ LVDS1 19 GAIN_ADC5o 0 OFFSET_ADC5o 1A GAIN_ADC5e 0 OFFSET_ADC5e 1B GAIN_ADC6o 0 OFFSET_ADC6o 1C GAIN_ADC6e 0 OFFSET_ADC6e 1D GAIN_ADC7o 0 OFFSET_ADC7o 1E GAIN_ADC7e 0 OFFSET_ADC7e 1F GAIN_ADC8o 0 OFFSET_ADC8o 20 GAIN_ADC8e 0 OFFSET_ADC8e 21 PAT_PRB S_LVDS5 PAT_PRBS_ LVDS6 PAT_PRBS_ LVDS7 PAT_PRBS_ LVDS8 PAT_LVDS5 PAT_LVDS6 0 HPF_CORNER_ADC5-8 DIG_HPF_ EN_ADC5-8 23 0 0 0 0 0 0 0 0 PAT_LVDS7 PAT_LVDS8 0 0
06-09

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值