代码日常(1)

代码日常(1)

1/2

将数据按照奇偶排
输入10个数,将10个整数按升序排列输出,并且奇数在前,偶数在后。如果输入的10个数是:10 9 8 7 6 5 4 3 2 1 ,则输出:1,3,5,7,9,2,4,6,8,10。(提示:可定义2个数组,一个用来存放输入的整数,并对这个数组进行排序,然后将数据按先奇数后偶数的顺序分别复制到另一个数组中,再输出第二个数组,注意最后一个数据的格式与前面9个不同)。
程序运行结果如下:
Input 10 numbers:
3 12 7 65 8 4 17 25 36 50↙
Output: 3,7,17,25,65,4,8,12,36,50
输入格式: “%d”
输入数据提示信息:”Input 10 numbers:\n”
输出格式:
输出数据提示信息:”Output: “ (注:冒号“:”的后面有一个空格)
前9个数据的输出格式:”%d,”
最后一个数据的输出格式:”%d\n”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void bubble(int* a, int n); // 建议传入数组长度,更通用

int main()
{
int a[10]; // 原始数组
int b[10]; // 目标数组
int i, k = 0; // k 用来记录 b 数组当前填到了第几位

// 1. 输入
printf("Input 10 numbers:\n");
for (i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}

// 2. 排序 (对 a 进行升序排序)
bubble(a, 10);

// 3. 复制数据到 b 数组
// 第一步:先挑出所有奇数
for (i = 0; i < 10; i++) {
if (a[i] % 2 != 0) {
b[k] = a[i];
k++; // 每存一个,b 的下标后移一位
}
}
// 第二步:再挑出所有偶数
for (i = 0; i < 10; i++) {
if (a[i] % 2 == 0) {
b[k] = a[i];
k++;
}
}

// 4. 统一输出
printf("Output: ");
for (i = 0; i < 9; i++) {
// 前9个数字带逗号
printf("%d,", b[i]);
}
// 最后一个数字带换行 (b[9])
printf("%d\n", b[9]);

return 0;
}

// 冒泡排序标准写法
void bubble(int a[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}

==只用了两个数组,逻辑清晰(先排好序,再按顺序“捡”进新数组)。==


2/2

*将1到9这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍,问应当怎样分。

**输出格式要求:”No.%d: %d %d %d\n”

思路提示:对第一个3位数进行穷举,然后2,3分别得到另外两个数。再判断3个数的9个位是否有重复数据(建议把这9个数位分别求出后存入一维数组,再编写一个函数判断一维数组中是否有重复数据。重复数据的判断就是两两比较,只要有一个相等的,就return 0,循环结束后return 1))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>

int judge(int, int, int);

int main() {
int count = 1, num1, num2, num3;
for (int i = 1; i <= 9; i++) {
for (int j = 1;j <= 9;j++) {
for (int k = 1;k <= 9;k++) {
num1 = k + j * 10 + i * 100;
num2 = num1 * 2;
num3 = num1 * 3;
if (num3 >= 1000) {
return 0;
}
if (!judge(num1, num2, num3)) {
printf("No.%d: %d %d %d\n", count, num1, num2, num3);
count++;
}
else {
continue;
}
}
}
}
return 0;
}
int judge(int num1, int num2, int num3) {
int a[9];
int digit = num1 + num2 * 1000 + num3 * 1000000;
for (int i = 0;i < 9;i++) {
a[i] = digit % 10;
digit = digit / 10;
}
for (int i = 0;i < 9;i++) {
for (int j = 0;j < 9;j++) {
if ((i != j && a[i] == a[j]) || a[i] == 0 || a[j] == 0) {
return 1;
}
}
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <stdbool.h> // 使用 bool 类型让代码可读性更强

// 函数声明:检查三个数是否正好由1-9组成且无重复
int check(int n1, int n2, int n3);

int main() {
int num1, num2, num3;
int count = 1;

// 优化:直接遍历 num1。
// 最小是123 (最小的3位数),最大是329 (因为 330*3 > 987 且包含0,实际上严格界限到 329 即可)
for (num1 = 123; num1 <= 329; num1++) {
num2 = num1 * 2;
num3 = num1 * 3;

// 这里的判断其实通过循环范围已经大概率避免了,但为了严谨可以保留
if (num3 >= 1000) break;

if (check(num1, num2, num3)) {
printf("No.%d: %d %d %d\n", count++, num1, num2, num3);
}
}
return 0;
}

int check(int n1, int n2, int n3) {
// 定义一个标记数组,用来记录 1-9 出现的次数
// 下标 0 不用,下标 1-9 对应数字 1-9
int used[10] = {0};

// 把三个数放入一个数组,方便循环处理
int nums[3] = {n1, n2, n3};

for (int i = 0; i < 3; i++) {
int temp = nums[i];
while (temp > 0) {
int digit = temp % 10;

// 如果出现 0,或者该数字已经被标记过(即重复出现)
if (digit == 0 || used[digit] == 1) {
return 0; // 不符合条件,返回 0 (False)
}

used[digit] = 1; // 标记该数字已出现
temp /= 10;
}
}

return 1; // 所有检查都通过,返回 1 (True)
}

代码日常(1)
http://example.com/2025/12/13/代码日常(1)/
作者
王柏森
发布于
2025年12月13日
许可协议