第一题
1、请编写函数void Func(int *a, int *n);它的功能是:求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。注:假设a所指的数组有足够的空间存储满足条件的数。
/*
1、请编写函数void Func(int *a, int *n);它的功能是:求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。注:假设a所指的数组有足够的空间存储满足条件的数。
*/
#include <stdio.h>
void Func(int *arr, int *n) {
for (int i = 1; i < 1001; i++) {
if (i % 7 == 0 && i % 11 == 0) continue;
if (i % 7 == 0 || i % 11 == 0) {
*(arr + (*n)++) = i;
}
}
}
int main() {
int arr[1000], n = 0;
Func(arr, &n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
第二题
2、编一个函数,用递归方法求n阶勒让德多项式的值。其中:多项式的值通过函数返回,多
项式的阶n以及多项式的变量x通过函数参数传递。递归公式如下:
p n ( x ) = { 1 ( n = 0 ) x ( n = 1 ) ( ( 2 n − 1 ) ∗ x − p n − 1 ( x ) − ( n − 1 ) ∗ p n − 2 ( x ) ) / n ( n ≥ 1 ) p_n(x)=\begin{dcases} 1 & (n=0) \\ x & (n=1) \\ ((2n-1)*x-p_{n-1}(x)-(n-1)*p_{n-2}(x))/n & (n \geq 1) \end{dcases} pn(x)=⎩⎪⎨⎪⎧1x((2n−1)∗x−pn−1(x)−(n−1)∗pn−2(x))/n(n=0)(n=1)(n≥1)
#include <stdio.h>
int temp[100];
int calc(int n, int x) {
if (temp[n]) return temp[n];
int res;
if (n == 0)
res = 1;
else if (n == 1)
res = x;
else
res = ((2 * n - 1) * x - calc(n - 1, x) - (n - 1) * calc(n - 2, x)) / n;
return temp[n] = res;
}
int main() {
int n, x;
scanf("%d%d", &n, &x);
int res = calc(n, x);
return 0;
}
第三题
3、有一个单链表,其结点的元素值以非递减有序排列,编写一个函数删除该单链表中多余的元素值相同的结点。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node {
int data;
struct Node *next;
} LinkList;
void deletSameEle(LinkList *head) {
// 答案就是这个函数
LinkList *p = head->next, *q = head->next;
while (p) {
while (q && p->data == q->data)
q = q->next;
p->next = q;
p = p->next;
}
}
void PrintLink(LinkList *head) {
// 打印链表
LinkList *p = head->next;
while (p) {
printf("%d->", p->data);
p = p->next;
}
printf("NULL\n");
}
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
int n = 0, arr[100];
LinkList *head = (LinkList *)malloc(sizeof(LinkList)), *p = head;
srand((unsigned)time(NULL));
for (int i = 0; i < n; i++) {
arr[i] = rand() % 10;
}
qsort(arr, n, sizeof 4, cmp);
for (int i = 0; i < n; i++) {
LinkList *temp = (LinkList *)malloc(sizeof(LinkList));
temp->data = arr[i];
p->next = temp;
p = p->next;
}
p->next = NULL;
PrintLink(head);
deletSameEle(head);
PrintLink(head);
return 0;
}
第四题
4、设一棵二义树以二叉链表为存储结构,设计一个算法求二义树的高度。
参考oj,acwing:71. 二叉树的深度https://www.acwing.com/problem/content/description/67/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10 // 不能使用const, c语言里面的const表示只读,不能用来定义数组大小
typedef struct TreeNode {
int data;
struct TreeNode *lchild, *rchild;
} TreeNode;
int treeDepth(TreeNode *root) {
// 求二叉树高度
if (!root) return 0;
return max(treeDepth(root->lchild), treeDepth(root->rchild)) + 1;
}
int main() {
// 参考oj,acwing:71. 二叉树的深度<https://www.acwing.com/problem/content/description/67/>
return 0;
}