C试题
第2题:请编写函数fun,它的功能是:求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。
ChatGPT回答如下:
主要考察了以下几个知识点:
-
循环语句:程序需要从1到1000依次遍历每个整数,因此需要使用循环语句来实现。
-
条件语句:程序需要判断每个整数是否符合条件,因此需要使用条件语句来实现。
-
数组:程序需要存储符合条件的整数,因此需要使用数组来存储这些整数。
-
输出:程序需要输出符合条件的整数,因此需要使用输出语句来实现。
总的来说,这道题目综合考察了对基本语法的掌握,同时也需要对数组的使用有一定的了解。
该程序的解题思路:
首先,我们需要从1到1000依次遍历每个整数,判断它们是否符合条件。题目中要求找出能被7或11整除但不能同时被它们整除的整数,即符合以下条件:
- 能被7整除,但不能同时被11整除;
- 能被11整除,但不能同时被7整除。
根据这两个条件,我们可以使用if语句来判断每个整数是否符合条件。如果符合条件,则将它存储在一个数组中。
最后,我们需要输出符合条件的整数。我们可以先输出符合条件的整数的个数,然后再依次输出每个整数。由于我们是将符合条件的整数存储在一个数组中,所以我们可以倒序遍历数组,并依次输出每个整数。
总的来说,这道题目主要考察了对循环和条件语句的掌握,同时还需要对数组的使用有一定的了解。
1.以下是C语言代码实现:
#include <stdio.h>
int fun(int a[], int n) {
int count = 0;
for (int i = 1; i <= 1000; i++) {
if ((i % 7 == 0 || i % 11 == 0) && i % 77 != 0) {
a[count] = i;
count++;
}
}
return count;
}
int main() {
int a[1000];
int n = fun(a, 1000);
printf("There are %d numbers that can be divided by 7 or 11 but not both:\n", n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
在fun函数中,我们遍历了1到1000之间的所有整数,判断它们是否能被7或11整除且不能同时被7和11整除,如果符合条件,则将它们存储在a数组中,并计算符合条件的整数的个数。在main函数中,我们定义了一个包含1000个元素的数组a,并调用fun函数计算出所有符合条件的整数,并将它们打印输出。
2.另一种C语言实现方式,可以使用指针来返回符合条件的整数数组。以下是代码实现:
#include <stdio.h>
#include <stdlib.h>
int* fun(int* n) {
int count = 0;
int* a = (int*)malloc(1000 * sizeof(int));
for (int i = 1; i <= 1000; i++) {
if ((i % 7 == 0 || i % 11 == 0) && i % 77 != 0) {
a[count] = i;
count++;
}
}
*n = count;
return a;
}
int main() {
int n;
int* a = fun(&n);
printf("There are %d numbers that can be divided by 7 or 11 but not both:\n", n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
free(a);
return 0;
}
在fun函数中,我们使用动态内存分配函数malloc分配了1000个整数大小的空间,并将符合条件的整数存储在数组a中。同时,我们使用指针n来返回符合条件的整数个数。在main函数中,我们调用fun函数获取符合条件的整数数组及其个数,并将它们打印输出,最后释放a数组所占用的内存空间。
这种方法相对于第一种方法,具有更好的灵活性和可扩展性,但是需要注意在使用完动态分配的内存空间后,需要及时释放它们,以避免内存泄漏的问题。
3.还有一种比较简洁的实现方式,可以使用动态数组来存储符合条件的整数。以下是代码实现:
#include <stdio.h>
#include <stdlib.h>
int main() {
int count = 0;
int* a = NULL;
for (int i = 1; i <= 1000; i++) {
if ((i % 7 == 0 || i % 11 == 0) && i % 77 != 0) {
count++;
a = (int*)realloc(a, count * sizeof(int));
a[count - 1] = i;
}
}
printf("There are %d numbers that can be divided by 7 or 11 but not both:\n", count);
for (int i = 0; i < count; i++) {
printf("%d ", a[i]);
}
printf("\n");
free(a);
return 0;
}
在这个实现方式中,我们首先初始化了一个整数变量count和一个指向整数的动态数组a。在循环中,我们判断符合条件的整数,并将它们存储在数组a中。当存储的整数个数超过数组a的大小时,我们使用动态内存分配函数realloc重新分配更大的内存空间,并将原有的整数复制到新的内存空间中。最后,我们打印输出符合条件的整数,并释放所分配的内存空间。
这种实现方式比较简洁,没有使用指针,也没有使用静态数组,而是直接使用动态数组来存储符合条件的整数,具有更好的灵活性和可扩展性,但是需要注意在使用完动态分配的内存空间后,需要及时释放它们,以避免内存泄漏的问题。
4.还有一种实现方式是使用静态数组来存储符合条件的整数。以下是代码实现:
#include <stdio.h>
int main() {
int count = 0;
int arr[1000];
for (int i = 1; i <= 1000; i++) {
if ((i % 7 == 0 || i % 11 == 0) && i % 77 != 0) {
arr[count++] = i;
}
}
printf("There are %d numbers that can be divided by 7 or 11 but not both:\n", count);
for (int i = count - 1; i >= 0; i--) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
在这个实现方式中,我们定义了一个大小为1000的静态数组arr,用来存储符合条件的整数。在循环中,我们判断符合条件的整数,并将它们存储在数组arr中。我们使用count变量来记录存储在数组中的整数个数。最后,我们倒序遍历数组arr,并输出符合条件的整数。
这种实现方式使用静态数组来存储符合条件的整数,相比于前面的两种实现方式,具有更好的遍历效率和空间利用率。但是,它的缺点是需要预先估计所需的空间大小,如果数组大小不够,需要重新定义数组大小,容易导致代码复杂度增加。同时,如果数组过大,可能导致栈溢出的问题。
5.还有一种实现方式是使用链表来存储符合条件的整数。以下是代码实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} Node;
int main() {
int count = 0;
Node* head = NULL;
for (int i = 1; i <= 1000; i++) {
if ((i % 7 == 0 || i % 11 == 0) && i % 77 != 0) {
count++;
Node* p = (Node*)malloc(sizeof(Node));
p->data = i;
p->next = head;
head = p;
}
}
printf("There are %d numbers that can be divided by 7 or 11 but not both:\n", count);
Node* p = head;
while (p) {
printf("%d ", p->data);
Node* q = p;
p = p->next;
free(q);
}
printf("\n");
return 0;
}
在这个实现方式中,我们定义了一个结构体Node,用来表示链表的节点。在循环中,我们判断符合条件的整数,并将它们存储在一个新的节点p中。我们将这个新的节点p插入到链表头部,使得链表中的节点按照倒序的顺序存储符合条件的整数。最后,我们打印输出符合条件的整数,并释放所分配的内存空间。
这种实现方式使用链表来存储符合条件的整数,相比于前面的实现方式,具有更好的可扩展性和灵活性。同时,它也避免了在使用静态或动态数组时需要频繁地调整数组大小的问题。但是,它的缺点是需要额外的时间和空间来维护链表结构,同时也需要遍历整个链表来输出符合条件的整数,效率较低。