导航

自己做的一些题

做的一些C语言作业


微小的说明

想当年作业催得紧,编程又不会,幸好网上各路大佬积极分享他们的思想成果帮了我一把。我在此也记录两下我写过的题,在巩固自身的同时服务后人。

基本都是PTA上学校所布置的题目作业,挺简单的,有时间的还是自己想想自己写吧。

函数题

使用函数求奇数和

题干

本题要求实现一个函数,计算N个整数中所有奇数的和,同时实现一个判断奇偶性的函数。
函数接口定义:

int even( int n );
int OddSum( int List[], int N );

其中函数even将根据用户传入的参数n的奇偶性返回相应值:当n为偶数时返回1,否则返回0。函数OddSum负责计算并返回传入的N个整数List[]中所有奇数的和。
裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

int even( int n );
int OddSum( int List[], int N );

int main()
{    
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    printf(") = %d\n", OddSum(List, N));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6
2 -3 7 88 0 15

输出样例:

Sum of ( -3 7 15 ) = 19

我的代码

#include <stdio.h>

#define MAXN 10

int even( int n );
int OddSum( int List[], int N );

int main()
{    
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    
    printf(") = %d\n", OddSum(List, N));

    return 0;
}

/* 你的代码将被嵌在这里 */
int even(int n)
{
    if(n % 2 == 0) {
        return 1;
    } else {
        return 0;
    }
    
}

int OddSum(int list[], int N)
{
    int sum = 0;

    for(int i = 0; i < N; i++) {
        if(even(list[i]) == 0) {
            sum = sum + list[i];
        }
    }

    return sum;
}

解析

很简单。唯一需要注意的地方就是

int even( int n )

这个函数一般人都是简单粗暴的写成:

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

运行,没毛病。
但是本题这种情况中这个函数可能会返回-1。那为什么还可以运行呢?因为我下面的计算函数是当返回0时才开算,其他值效果一样,全是抛掉,所以我们这里“简单粗暴”不会出问题。
为了提醒我们有这回事,我们在这里把函数老老实实的写成:

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

建议深入了解数学取模取余。
参考链接:
-实数范围内的求模(求余)运算:负数求余究竟怎么求

求单链表元素序号

题干

本题要求实现一个函数,求带头结点的单链表中元素序号。
函数接口定义:

int Locate ( LinkList L, ElemType e);

L是带头结点的单链表的头指针,e是要查找的元素值。如果e在单链表中存在,函数Locate返回其序号(序号从1开始);否则,返回0。

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

LinkList Create();/* 细节在此不表 */

int Locate ( LinkList L, ElemType e);

int main()
{
    ElemType e;
    LinkList L = Create();
    scanf("%d",&e);
    printf("%d\n", Locate(L,e));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1 4 5 3 -1
5

输出样例:

4

我的代码

int Locate ( LinkList L, ElemType e)
{
    LNode *p;
    int i = 0;
    p = L;
    //从一号节点开始,如果有一号节点的话。
    while (p->next != NULL) {
        p = p->next;
        i++;
        if(p->data == e) {
        //找到了,回i
            return i;
        }

    }
    //如果找不到,那就回0
    return 0;
}

解析

很简单,看注释,不需要解析。

按序号查找单链表

题干

本题要求实现一个函数,Get_LinkList(LinkList L, int i)函数是在带头结点单链表中按序号查找第i个结点的节点,函数返回第i个结点的指针。

函数接口定义:

LNode *Get_LinkList(LinkList L, int i);

其中 L 和 i 都是用户传入的参数。 L是带头结点单链表的头指针; i 是结点的序号。函数须返回 第i个结点的指针。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#define FLAG  -1
#include <stdio.h>
#include <malloc.h>
typedef int datatype;
typedef struct node
{
    datatype data;
    struct node *next;
}LNode, *LinkList;

LinkList Creat_LinkList();/*这里忽略函数的实现*/


LNode *Get_LinkList(LinkList L, int i);

int main()
{
    LinkList L;
    int i;
    LNode *p;

    L = Creat_LinkList();
    if(L == NULL)
    { 
        printf("L=NULL,error!"); 
        return 0;  
    }

    scanf("%d",&i);
    if(p = Get_LinkList(L,i))  printf("%d",p->data);
    else printf("NOT");
    return 0;
}

/* 请在这里填写答案 */

输入样例:

11 22 33 44 55 -66 -77 -88 -99 -1
8

输出样例:

-88

我的代码

LNode *Get_LinkList(LinkList L, int i)
{
    int temp = 0;
    LNode *temp_p = L;
    //能找到的情况
    while(temp != i && temp_p->next != NULL) {
        temp_p = temp_p->next;
        temp++;
        if(temp == i) {
            return temp_p;
        }
    }
    //如果找不到,那么意味着temp == i && temp_p->next == NULL
    return NULL;
}

CSP CCF计算机资格认证

现值计算

题目描述

L6PJq.png

思路

使用了C++迭代器来做。

我的代码

#include <iostream>
#include <cstdio>
#include <cstdint>
#include <cmath>
#include <vector>
// #include <bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);


    double n;
    double i;

    cin >> n;
    cin >> i;

    vector<double> in_list;

    for(double i = 0, input_temp; i < n + 1; i++)
    {
        cin >> input_temp;
        in_list.push_back(input_temp);
    }
    
    double output = 0;

    for(auto iter = in_list.begin(); iter != in_list.end(); iter++)
    {
        // cout << iter - in_list.begin() << '\n';
        output = output + (*iter) * pow((1 + i) , -(iter - in_list.begin()));
    }

    cout << output;

}

如此编码

题目描述

Lh5MV.png

#include <iostream>
#include <cstdio>
#include <cstdint>
#include <cmath>
#include <vector>
// #include <bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);


    uint64_t n;
    uint64_t m;

    cin >> n;
    cin >> m;

    // 选项个数数组
    vector<uint64_t> a_list;

    for(uint64_t i = 0, input_temp; i < n; i++)
    {
        cin >> input_temp;
        a_list.push_back(input_temp);
    }

    vector<uint64_t> c_list;
    // 下方循环第一次条件不满足自动加初始1
    // c_list.push_back(0);

    for(auto iter = a_list.begin(); iter != a_list.end(); iter++)
    {
        uint64_t temp = 1;
        for(auto in_iter = a_list.begin(); in_iter != iter; in_iter++)
        {
            temp = temp * (*in_iter);
        }
        c_list.push_back(temp);
    }

    // 输出数组
    // 注意,下方填入输出数组时是倒序填入的。
    vector<uint64_t> reverse_b_list;

    // 权重试错法
    // c_list中的各个数就是b_list相对应的系数权重,对比权重与最终之和,就可以得出对应b_list未知数。从最大权重,末尾,算起。
    // 获取最后的迭代器时要注意,获取到的是向量末尾的,已经超出向量组了。

    // 中间变量,最大值
    // 每次进行最大值对比后都要减去已经“比掉”的值。
    uint64_t used_m = m;
    for(auto iter = c_list.end(); iter != c_list.begin(); iter--)
    {
        uint64_t temp = 0;
        // cout << iter - c_list.begin();
        // 获取本题最大选项值
        for(; temp < a_list.at(iter - 1 - c_list.begin()); temp++)
        {
            // cout << "检查点1 " << a_list.at(iter - 1 - c_list.begin()) << ' ' <<temp * (*iter) << '\n';
            if(temp * (*(iter - 1)) > used_m)
            {
                // temp--;
                break;
            }
        }
        // 每次进行最大值对比后都要减去已经“比掉”的值。
        used_m = used_m - ((temp - 1) * (*(iter - 1)));
        reverse_b_list.push_back(temp - 1);
    }

    for(auto tt = reverse_b_list.end(); tt != reverse_b_list.begin(); tt--)
    {
        cout << *(tt - 1) << ' ';
    }
}

posted on 2020-11-03 10:46  二所  阅读(417)  评论(0编辑  收藏  举报