C试题
第3题:请编写函数void fun(int x,int pp[],int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
ChatGPT回答如下:
主要考察了以下几个知识点:
- 循环语句:使用
for
循环遍历整数 1 到x
; - 分支语句:使用
if
条件判断语句判断当前数是否为偶数,并跳过; - 数组:用于存放能整除
x
且不是偶数的各整数,并按从小到大的顺序排列; - 指针:用于返回整数数组
pp
的长度。
这些知识点是 C 语言中比较基础的内容,熟练掌握它们对于编写高质量的 C 语言程序非常重要。
该程序的解题思路:
这个程序主要的解题思路如下:
- 先使用
for
循环遍历整数 1 到x
; - 对于每一个整数,使用
if
条件判断语句判断当前数是否为偶数,如果是偶数则跳过; - 如果当前数能整除
x
且不是偶数,则将其存入数组pp
中; - 最后,返回整数数组
pp
的长度。
解法一:
#include <stdio.h>
void fun(int x, int pp[], int *n) {
int cnt = 0;
for (int i = 1; i <= x; i++) {
if (i % 2 == 0) continue;
if (x % i == 0) {
pp[cnt++] = i;
}
}
*n = cnt;
}
int main() {
int x = 24;
int pp[100];
int n;
fun(x, pp, &n);
printf("The divisors of %d that are odd are:\n", x);
for (int i = 0; i < n; i++) {
printf("%d ", pp[i]);
}
printf("\n");
return 0;
}
其中,函数 fun
的参数说明如下:
x
:需要求解的数;pp
:用于存放能整除x
且不是偶数的各整数,按从小到大的顺序排列;n
:整数数组pp
的长度。
函数 fun
的实现思路如下:
- 初始化计数器
cnt
为 0; - 从 1 遍历到
x
,判断当前数是否为偶数,如果是则跳过; - 判断当前数是否为
x
的因数,如果是则将其存入数组pp
中,并将计数器cnt
加 1; - 遍历结束后,将计数器
cnt
的值赋给指针变量n
,表示数组pp
的长度。
在 main
函数中,我们可以调用函数 fun
并输出结果,如上面的代码所示。
是的,实现这个功能的 C 语言代码还有其他的写法,下面给出两种不同的实现方式供参考。
解法二:
#include <stdio.h>
int fun(int x, int pp[])
{
int i, j = 0;
for (i = 1; i <= x; i++) {
if (i % 2 == 0) {
continue;
}
if (x % i == 0) {
pp[j++] = i;
}
}
return j;
}
int main()
{
int x = 12, pp[100], n, i;
n = fun(x, pp);
for (i = 0; i < n; i++) {
printf("%d ", pp[i]);
}
printf("\n");
return 0;
}
解法三:
#include <stdio.h>
int fun(int x, int pp[])
{
int i, j;
j = 0;
for (i = 1; i <= x; i++) {
if (i % 2 == 0) {
continue;
}
if (x % i == 0) {
*(pp + j) = i;
j++;
}
}
return j;
}
int main()
{
int x = 12, pp[100], n, i;
n = fun(x, pp);
for (i = 0; i < n; i++) {
printf("%d ", *(pp + i));
}
printf("\n");
return 0;
}
这两种实现方式的主要区别在于数组元素的访问方式不同,第一种方式使用 pp[i]
,第二种方式使用 *(pp + i)
。但是它们的实现思路都是一样的,都是通过循环遍历 1 到 x
,判断每一个数是否为偶数,如果不是偶数且能整除 x
,则将其存入数组 pp
中,并返回数组的长度。