来源题库:c.code2ji.cn

题目一:去除偶数生成新数
题目描述:
从输入的正整数中提取出所有奇数位上的数字,并将这些数字重新组合成一个新的整数输出。若输入无效,需重新输入。
题库出处:c.code2ji.cn

🎯 示例输入输出:
📥 输入:12345678
📤 输出:1357
为什么?原数 12345678 从个位开始向前找奇数:
个位 8 ❌、十位 7 ✅、百位 6 ❌、千位 5 ✅…… 依次组合成新数1357。
🔰 初始代码(填空题形式)
#include <stdio.h>
void fun(unsigned long *n) {
unsigned long x = 0, i = 1; // x存新数,i表示当前位权值
int t;
while (*n) {
t = *n % __1__;
if (t % 2 != __2__) {
x = x + t * i;
i = i * 10;
}
*n = *n / 10;
}
*n = __3__;
}
int main(void) {
unsigned long n = -1;
while (n > 99999999 || n <= 0) {
printf("Please input(0<n<100000000): ");
scanf("%ld", &n);
}
fun(&n);
printf("\nThe result is: %ld\n", n);
return 0;
}
✅ 填空答案:
__1__:10__2__:0__3__:x
🧠 每行详细解释
unsigned long x = 0, i = 1;
x是我们最终要输出的新数。i是“位权值”,开始是个位,之后乘以10,变成十位、百位……
t = *n % 10;
- 经典操作:
% 10取个位。 - 比如
123 % 10 = 3
if (t % 2 != 0)
- 判断这个数字是不是奇数。
% 2 == 0是偶数,!= 0就是奇数。
x = x + t * i;
- 如果是奇数,就加到新数中。
- 举个例子:当前
x = 13,t = 5,i = 100 x = 13 + 5*100 = 513
i = i * 10;
- 准备处理下一位,个位 → 十位 → 百位
*n = *n / 10;
- 去掉最低位,继续处理剩下的数字。
123 / 10 = 12
*n = x;
- 把最终的新数写回原变量。
- 因为
fun(&n)是传地址,修改*n就能改主函数里的值。
题目二:结构体数组按姓名排序(字典序)
题目描述:
定义学生结构体,按姓名从小到大(字典序)排序,输出排序前后的结果。
题库出处:c.code2ji.cn

🔰 初始代码(含填空)
#include <stdio.h>
#include <string.h>
__1__ {
long sno;
char name[10];
float score[3];
};
void fun(struct student a[], int n) {
struct student t;
int i, j;
for (i = 0; i < __2__; i++)
for (j = i + 1; j < n; j++)
if (strcmp(__3__) > 0) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
✅ 填空答案:
__1__:struct student__2__:n - 1__3__:a[i].name, a[j].name
🧠 每段解释:
struct student {
long sno;
char name[10];
float score[3];
};
- 定义学生结构体:学号 + 姓名 + 三门成绩
void fun(struct student a[], int n)
- 传入结构体数组,长度为n
for (i = 0; i < n - 1; i++)
- 冒泡排序外循环,进行n-1轮
strcmp(a[i].name, a[j].name) > 0
- 字典序判断:如果
i的名字比j的大,就交换 strcmp返回正数表示第一个比第二个大
以下是 所有剩余题目 的完整精讲整理(按照你要求的格式):
题目三:螺旋矩阵生成
题目描述:实现一个函数
fun,用于生成一个特殊的 N×N 二维数组图案,最外层填 1,内层填 2,以此类推,直到中心。
题库出处:c.code2ji.cn

示例输出:
The result is:
1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 2 3 3 3 2 1
1 2 3 4 3 2 1
1 2 3 3 3 2 1
1 2 2 2 2 2 1
1 1 1 1 1 1 1
初始代码(含填空)
#include <stdio.h>
#define N 7
void fun(int (*a)[N]) {
int i, j, k, m;
if (N % 2 == 0)
m = N / 2;
else
m = N / 2 + 1;
for (i = 0; i < m; i++) {
for (j = i; j < N - i; j++)
a[i][j] = a[N - i - 1][j] = i + 1;
for (k = i + 1; k < N - i - 1; k++)
a[k][i] = a[k][N - i - 1] = i + 1;
}
}
int main(void) {
int x[N][N] = {0}, i, j;
fun(x);
printf("\nThe result is:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%3d", x[i][j]);
printf("\n");
}
return 0;
}
填空答案(题库式)
__1__:[N]__2__:i__3__:i + 1
关键逻辑讲解:
- 函数
fun(int (*a)[N])代表传二维数组 - 外层
for (i=0; i<m; i++)表示一圈圈地填 a[i][j] = a[N-i-1][j] = i+1:上下对称地填数a[k][i] = a[k][N-i-1] = i+1:左右对称地填数- 变量
m是圈数 = N/2(奇数加1)
题目四:复制最右边的字符
题目描述:从字符串右边起截取 n 个字符保存到另一个字符串中。
题库出处:c.code2ji.cn

示例输入输出:
输入:
hello world
5
输出:
world
初始代码(含填空)
#include <stdio.h>
#include <string.h>
#define N 80
void fun(char *s, int n, char *t) {
int len, i, j = 0;
len = strlen(s);
if (n >= len)
strcpy(t, s);
else {
for (i = len - n; i <= len - 1; i++)
t[j++] = s[i];
t[j] = '\0';
}
}
int main(void) {
char s[N], t[N];
int n;
printf("Enter a string: ");
gets(s);
printf("Enter n: ");
scanf("%d", &n);
fun(s, n, t);
printf("The string t: ");
puts(t);
return 0;
}
填空答案
__1__:t, s__2__:s[i]__3__:'\0'
分析解释:
strlen(s):求出原串长度- 若
n >= len,说明要复制整个串 - 否则从
len - n开始一个个复制 - 最后加上
'\0'是字符串结束标志 gets(s)虽然不推荐,但考试中常见

2750

被折叠的 条评论
为什么被折叠?



