用c语言写,有n个整数,请把它们逆序排列,即第1个元素和最后1个元素交换位置,第2个元素和倒数第2个元素交换位置,以此类推。输出逆序排列后的结果。 输入 输入数据有多组,每组单独占一行,第1个数n(n<=20)表示该组测试数据的个数,后跟n个整数。n为0时结束,不处理。 输出 对应每组输入,输出逆序的结果,每组单独占一行,数据之间用一个空格分隔。
时间: 2024-02-16 09:05:06 浏览: 46
以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
int main() {
int n;
while (scanf("%d", &n) == 1 && n != 0) {
int nums[20];
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
for (int i = 0; i < n / 2; i++) {
int temp = nums[i];
nums[i] = nums[n-1-i];
nums[n-1-i] = temp;
}
for (int i = 0; i < n; i++) {
printf("%d ", nums[i]);
}
printf("\n");
}
return 0;
}
```
这里使用了循环来读取输入数据,并将其存储在数组中。然后再使用循环将数组中对应位置的数交换,最后输出逆序排列后的结果。需要注意的是,C 语言中的数组下标从 0 开始,因此在交换数组中的元素时,需要将最后一个元素的下标表示为 `n-1`。
相关问题
用c语言写出一个代码:有n个整数,请把它们逆序排列,即第1个元素和最后1个元素交换位置,第2个元素和倒数第2个元素交换位置,以此类推。输出逆序排列后的结果。
好,以下是用C语言实现的代码:
```c
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void reverse(int arr[], int n) {
int i, j;
for (i = 0, j = n - 1; i < j; i++, j--) {
swap(&arr[i], &arr[j]);
}
}
int main() {
int n, i;
printf("请输入整数个数n:");
scanf("%d", &n);
int arr[n];
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
reverse(arr, n);
printf("逆序排列后的结果为:");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
代码说明:
1. 定义了一个 `swap` 函数,用于交换两个整数。
2. 定义了一个 `reverse` 函数,用于将数组逆序排列。
3. 在 `main` 函数中,先读入整数个数 `n`,再读入 `n` 个整数,存入数组 `arr` 中。
4. 调用 `reverse` 函数将数组逆序排列。
5. 最后输出逆序排列后的结果。
1. 以字典序产生排列 【问题描述】给定正整数n生成1到n的全排列(利用书上P112页的字典序算法) 【输入形式】一个整数n(1<=n<=9) 【输出形式】n!行,每一行的第一个数是第几个全排列,第二个数是全排列打印(中间用制表符\t分开); 【样例输入】 3 【样例输出】 1 123 2 132 3 213 4 231 5 312 6 321 用C语言实现
以下是C语言实现代码:
```c
#include <stdio.h>
// 计算n的阶乘
int factorial(int n) {
int res = 1;
for (int i = 1; i <= n; i++) {
res *= i;
}
return res;
}
// 交换两个数
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 字典序全排列
void permutation(int n) {
int p[n];
// 初始化为1,2,3,...,n
for (int i = 0; i < n; i++) {
p[i] = i + 1;
}
int count = 0;
do {
count++;
printf("%d\t", count);
for (int i = 0; i < n; i++) {
printf("%d", p[i]);
}
printf("\n");
} while (next_permutation(p, n));
}
// 下一个字典序排列
int next_permutation(int *p, int n) {
// 从后往前找到第一个相邻的逆序对
int i = n - 2;
while (i >= 0 && p[i] >= p[i + 1]) {
i--;
}
// 如果找不到逆序对,说明已经是最后一个排列,返回0
if (i < 0) {
return 0;
}
// 从i的右侧找到最小的大于p[i]的数
int j = n - 1;
while (j > i && p[j] <= p[i]) {
j--;
}
// 交换p[i]和p[j]
swap(&p[i], &p[j]);
// 反转i右侧的元素
int k = i + 1, l = n - 1;
while (k < l) {
swap(&p[k], &p[l]);
k++;
l--;
}
return 1;
}
int main() {
int n;
printf("请输入一个整数n(1<=n<=9):");
scanf("%d", &n);
int count = factorial(n);
printf("%d!共有%d个全排列,输出如下:\n", n, count);
permutation(n);
return 0;
}
```
该程序使用了字典序全排列算法,先将1到n初始化为一个数组p,然后按照字典序的顺序依次输出全排列,直到输出了n!个全排列。在每次输出时,先输出当前排列的编号,然后再输出该排列的元素。在next_permutation函数中,实现了求下一个字典序排列的算法。