C语言部分期末答案(来自PTA)

int IsTheNumber(const int N)
{
    int arr[10000];
    if (sqrt(N) - (int)sqrt(N) == 0)
    {
        int i = 0, n = N;
        while (n != 0)
        {
            arr[i++] = n % 10;
            n /= 10;
        }
        for (int x = 0; x < i - 1; x++)
        {
            for (int j = x + 1; j < i; j++)
            {
                if (arr[x] == arr[j])
                    return 1;
            }
        }
    }
    return 0;
}

首先我们要判断一个数是否为完全平方数,其次我们要判断这个数中是否有至少两个相同的数字,重点是第二个,我们可以用嵌套for循环遍历数组,时间复杂度为o(n^2),我们还可以将每个位上的数字作为数组下标,遇到一个下标就加加,最后看有没有至少一个下标中的元素大于等于2

int cmp_arr(const void* p1, const void* p2)
{
    return (*(float*)p1 > *(float*)p2?1:-1);
}
ElementType Median(ElementType A[], int N)
{
    qsort(A, N, sizeof(A[0]), cmp_arr);
    return A[N / 2];
}

这个用qsort函数可以很快解决,但有个需要注意的地方是,这里判断两个元素大小不能用作差法,因为当差小于1大于0时,返回值会约等于0,导致最后结果不准确

int prime( int p )
{
    int flag = 1;
    if(p<2)
        return 0;
    for(int i=2;i<=sqrt(p);i++)
    {
        if(p%i==0)
        {
            flag=0;
            return 0;
        }
    }
    if(flag)
        return 1;
}
int PrimeSum( int m, int n )
{
    int sum = 0;
    for(int i=m;i<=n;i++)
    {
        if(prime(i))
            sum+=i;
    }
    return sum;
}

int narcissistic( int number )
{
    int a=number, b=number, x=0, sum=0;
    while(b!=0)
    {
        b/=10;
        x++;
    }
    while(number!=0)
    {
        sum+=pow(number%10, x);
        number/=10;
    }
    if(sum == a)
    return 1;
    else return 0;
}
void PrintN( int m, int n )
{
    for(int i=m+1;i<n;i++)
    {
        if(narcissistic(i))
            printf("%d\n",i);
    }
}

int fib(int n)
{
    int fib1 = 1, fib2 = 1, fib3 = 0;
    if (n <= 2)
        return 1;
    while (n > 2)
    {
        fib3 = fib1 + fib2;
        fib1 = fib2;
        fib2 = fib3;
        n--;
    }
    return fib3;
}
void PrintFN(int m, int n)
{
    int flag = 1;
    for (int i = 1; i <= n + 1; i++)
    {
        if (fib(i) >= m && fib(i) <= n)
        {
            if (flag)
            {
                printf("%d", fib(i));
                flag = 0;
            }
            else {
                printf(" %d", fib(i));
            }
        }
    }
    if(flag)
        printf("No Fibonacci number");
}

void CountOff(int n, int m, int out[])
{
    int arr[1000], j = 0, count = 1;
    for (int i = 0; i < n; i++)
    {
        arr[i] = i + 1;
        out[i] = 0;
    }
    for (int i = 1; i <= n; i++)
    {
        if (arr[i - 1] == 0)
        {
            if (i != n)
                continue;
            else
            {
                i = 0;
                continue;
            }
        }
        j++;
        if (j == m)
        {
            j = 0;
            arr[i - 1] = 0;
            out[i - 1] = count;
            count++;
        }
        if (i == n)
            i = 0;
        if (count == n)
        {
            for (int j = 0; j < n; j++)
            {
                if (out[j] == 0)
                    out[j] = count;
            }
            break;
        }
    }
}

int cmp_arr(const void* p1, const void* p2)
{
    return *(int*)p1 - *(int*)p2;
}
void sort( int a[], int n )
{
    qsort(a, n, sizeof(int), cmp_arr);
}

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
    if(list1 == NULL)
        return list2;
    else if(list2 == NULL)
        return list1;
    if(list1->data < list2->data)
    {
        list1->next = mergelists(list1->next, list2);
        return list1;
    }
    else
    {
        list2->next = mergelists(list1, list2->next);
        return list2;
    }
}

这个可以采取递归也就是上述代码,比较两个链表中的值,找到一个较小值将它头插在已经排序好的链表上,举个例子

给定两个链表1->2->4

2->3->5

首先比较,显然l1->val较小,然后执行函数mergelists(list->next, list2)

int main()
{
    int n, m, a[1000], b[1000];
    scanf("%d%d",&n, &m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(m>n)
        m=m-n;
    for(int i=0;i<n-m;i++)
    {
        b[i]=a[i];
    }
    for(int i=0;i<m;i++)
    {
        a[i]=a[i+n-m];
    }
    for(int i=0;i<n;i++)
    {
        if(i<n-m)
        a[i+m]=b[i];
        if(i==0)
            printf("%d",a[i]);
        else printf(" %d",a[i]);
    }
    return 0;
}

与力扣中的转轮数组一样,注意要考虑右移长度大于数组长度,可以采取取模的方式解决,除了上述方法,我们还可以用三步反转法

给定一个数组1 4 5 6 3 7,右移两个长度

先拆分成两部分1 4      5 3 6 7

第一部分反转4 1

第二部分反转7 6 3 5

和一块再反转5 3 6 7 1 4

int cmp_arr(const void* p1, const void* p2)
{
    return *(int*)p1 - *(int*)p2;
}
int main()
{
    int n, arr[n];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    qsort(arr, n, sizeof(int), cmp_arr);
    printf("min = %d",arr[0]);
    return 0;
}

int main()
{
    long long n;
    double h;
    scanf("%lf%lld", &h, &n);
    double s = 0;
    if (n == 0)
    {
        s = 0;
        h = 0;
    }
    else
    {
        s -= h;
        while (n > 0)
        {
            s += 2 * h;
            h /= 2;
            n--;
        }
    }
    printf("%.1lf %.1lf", s, h);
    return 0;
}

int cmp_str(const void* p1, const void* p2)
{
    return strlen(p1) - strlen(p2);
}
int main()
{
    char str[200][100];
    int i = 0;
    for (i = 0; ; i++)
    {
        scanf("%s", &str[i]);
        if (str[i][0] == '#')
            break;
    }
    qsort(str, i, sizeof(str[2]), cmp_str);
    for (int i = 0;; i++)
    {
        if (str[i][0] == '#')
            break;
        printf("%s ", str[i]);
    }
    return 0;
}

int main()
{
    int arr[1000], n, a = 0, sum = 1;
    char str;
    scanf("%d %c", &n, &str);
    for (int i = 0; i < 1000; i++)
    {
        if (i == 0)
            arr[i] = sum;
        else
        {
            sum += 2 * (2 * i + 1);
            arr[i] = sum;
        }
    }
    for (int i = n; i > 0; i--)
    {
        for (int j = 0; arr[j] <= i; j++)
        {
            if (i == arr[j])
                a = j + 1;
        }
        if (a)
            break;
    }
    for (int i = a; i > 0; i--)
    {
        for (int k = 0; k < a - i; k++)
            printf(" ");
        for (int j = 0; j < 2 * i - 1; j++)
            printf("%c", str);
        printf("\n");
    }
    for (int i = 2; i <= a; i++)
    {
        for (int k = 0; k < a - i; k++)
            printf(" ");
        for (int j = 0; j < 2 * i - 1; j++)
            printf("%c", str);
        printf("\n");
    }
    printf("%d", n - arr[a - 1]);
    return 0;
}

void Move(char* str, int a)
{
    char* p = str;
    int i = 0;
    while (*p)
    {
        if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z'))
        {
            if (a > 0)
            {
                for (int i = 0; i < a % 26; i++)
                {
                    *p += 1;
                    if (*p == 'z' + 1)
                        *p = 'a';
                    if (*p == 'Z' + 1)
                        *p = 'A';
                }
            }
            if (a < 0)
            {
                for (int i = 0; i < -a % 26; i++)
                {
                    *p -= 1;
                    if (*p == 'a' - 1)
                        *p = 'z';
                    if (*p == 'A' - 1)
                        *p = 'Z';
                }
            }
        }
        str[i++] = *p;
        p++;
    }
    str[i] = '\0';
}
int main()
{
    char str[1000];
    int n;
    gets(str);
    scanf("%d", &n);
    Move(str, n);
    printf("%s", str);
    return 0;
}

int main()
{
    double a, c;
    int b;
    scanf("%lf%d%lf",&a, &b, &c);
    if(b)
    {
        if(a*1.26>=c)
            printf("%.2lf T_T",a*1.26);
        else printf("%.2lf ^_^",a*1.26);
    }
    else
    {
        if(a*2.455>=c)
            printf("%.2lf T_T",a*2.455);
        else printf("%.2lf ^_^",a*2.455);
    }
    return 0;
}

int main()
{
    int a, b;
    scanf("%d%d",&a, &b);
    printf("%d",a+b-1);
    return 0;
}

int cmp_arr(const void* p1, const void* p2)
{
    return *(int*)p2 - *(int*)p1;
}
int main()
{
    int n, arr[n];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    qsort(arr, n, sizeof(arr[0]), cmp_arr);
    for(int i=0;i<n;i++)
    {
        if(i==0)
            printf("%d",arr[i]);
        else printf(" %d",arr[i]);
    }
    return 0;
}

int main()
{
    int n, arr[1000][1000];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        for(int k=0;k<n-i-1;k++)
            printf(" ");
        for (int j = 0; j <= i; j++)
        {
            if (j == 0 || j == i)
            {
                arr[i][j] = 1;
                printf("%4d", arr[i][j]);
            }
            else
            {
                arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
                printf("%4d", arr[i][j]);
            }
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枕眠秋雨>o<

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值