自己做的一些题
做的一些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计算机资格认证
现值计算
题目描述
思路
使用了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;
}
如此编码
题目描述
#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) << ' ';
}
}