Problem G: C语言习题 n个数逆序

这篇博客介绍了一个C语言编程题目,要求输入n个整数并逆序排列。内容包括问题描述、输入输出格式、示例以及解题提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“设计是一个发现问题、而不是发现解决方案的过程” —— Leslie Chicoine

Description

将n(n<20)个数按输入时顺序的逆序排列,用函数实现。

Input

n 和 n个整数

Output

逆序输出,空格分开

Sample Input

10
1 2 3 4 5 6 7 8 9 0

Sample Output

0 9 8 7 6 5 4 3 2 1

HINT

主函数已给定如下,提交时不需要包含下述主函数



/* C代码 */

int main()

{

    void sort (int *p,int m);

    int i,n;

    int *p,num[20];

    scanf("%d",&n);

    for (i=0; i<n; i++)

        scanf("%d",&num[i]);

    p=&num[0];

    sort(p,n);

    for (i=0; i<n-1; i++)

        printf("%d ",num[i]);

    printf("%d\n",num[n-1]);

    return 0;

}



/* C++代码 */

int main()

{

    void sort (int *p,int m);

    int i,n;

    int *p,num[20];

    cin>>n;

    for (i=0; i<n; i++)

        cin>>num[i];

    p=&num[0];

    sort(p,n);

    for (i=0; i<n-1; i++)

        cout<<num[i]<<" ";

    cout<<num[n-1]<<endl;

    return 0;

}

源代码:

#include <stdio.h>
void sort (int *p,int m)
{
    int a[m];
    for(int i=0;i<m;i++)
    {
        a[i]=*p;
        p++;
    }
    p-=m;
    for(int i=m-1;i>=0;i--)
    {
        *p=a[i];
        p++;
    }
}
int main()
{
    void sort (int *p,int m);
    int i,n;
    int *p,num[20];
    scanf("%d",&n);
    for (i=0; i<n; i++)
        scanf("%d",&num[i]);
    p=&num[0];
    sort(p,n);
    for (i=0; i<n-1; i++)
        printf("%d ",num[i]);
    printf("%d\n",num[n-1]);
    return 0;
}


<think>嗯,我现在需要解决的是用C语言将n个数逆序排列的问题。首先,我得回忆一下逆序排列的基本思路。应该是把数组的第一个元素和最后一个交换,第二个和倒数第二个交换,依此类推,直到中间位置对吧?比如有数组1,2,3,4,变成4,3,2,1。这样的话,交换的次数应该是n/2次,如果是n是偶数的话,刚好交换完;如果是奇数,中间那个数不用动。那具体怎么在代码里实现呢? 接下来,我得考虑如何输入n个数。用户需要先输入一个n,然后输入n个整数或者浮点数?假设题目里是整数吧。这候应该用数组来存储这些数。数组的大小应该根据n来定,可以用动态内存分配,或者直接定义一个足够大的数组。比如,如果n不超过100,可以定义int arr[100],然后读取n的值,再循环读取n个数到数组里。 然后就是逆序交换的部分。我需要两个指针,或者用下标来遍历数组。比如,用i从0开始,到n/2 -1的位置,每次交换arr[i]和arr[n-1 -i]。比如,当i=0,交换arr[0]和arr[n-1],i=1交换arr[1]和arr[n-2],以此类推。这样循环的次数是n/2次,不管n是奇数还是偶数,都可以覆盖到。比如n=5的候,循环到i=2的候,交换arr[2]和arr[2],也就是中间那个数自己和自己交换,不过其实这候可以优化一下,当i < n/2的候,或者i < (n-1)/2的候,避免中间的交换。或者不管它,反正交换也不会出错,只是多了一次操作。不过代码上可能更方便,统一处理。 那具体的交换操作,应该怎么写呢?比如,temp = arr[i]; arr[i] = arr[n-1 -i]; arr[n-1 -i] = temp; 这样的三步交换。这部分应该没问题。 然后,输出逆序后的数组。循环遍历数组,每个元素后面加个空格或者换行。 那整个程序的流程大概是这样的: 1. 输入n的值。 2. 输入n个数到数组。 3. 逆序交换数组元素。 4. 输出交换后的数组。 需要注意的是输入的n是否合法,比如n不能超过数组的最大长度,或者如果是动态分配的话,要确保内存分配成功。不过可能题目要求中不考虑这些错误处理,只是基本的实现。 举个例子,假设用户输入n=5,然后输入1 2 3 4 5,逆序后应该是5 4 3 2 1。那在交换的候,i从0到2: i=0交换0和4号元素,得到5 2 3 4 1; i=1交换1和3号元素,得到5 4 3 2 1; i=2交换2和2号元素,不变。所以最终结果正确。 那代码的大体结构应该是: #include <stdio.h> int main() { int n; printf("请输入元素个数n: "); scanf("%d", &n); int arr[n]; // 这里如果编译器支持C99的话可以用变长数组,否则可能需要动态分配 printf("请输入%d个整数: ", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } // 逆序交换 for (int i = 0; i < n / 2; i++) { int temp = arr[i]; arr[i] = arr[n - 1 - i]; arr[n - 1 - i] = temp; } // 输出结果 printf("逆序后的数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } 不过要注意变长数组在C99之后才支持,如果编译器不支持的话,可能需要用动态分配,比如: int *arr = (int*)malloc(n * sizeof(int)); 但这样的话,后面要记得free。不过对于小程序来说可能不需要。 另外,输入候应该检查scanf的返回值,确保输入正确。但可能题目中不要求处理这些错误。 那这样应该就可以实现逆序排列了。有没有其他方法?比如用递归或者栈,但显然交换的方法更高效,间复杂度是O(n),空间复杂度是O(1)(除了存储数组本身)。递归的话可能不太适合,因为需要额外的空间。 总结下来,步骤就是输入数组,然后交换对称位置的元素,直到中间位置,最后输出。</think>### C语言实现将n个数逆序排列的步骤 #### 1. **输入数据** - **输入元素个数n**:用户首先输入整数$n$,表示需要逆序排列的数的个数。 - **输入n个整数**:使用数组存储这$n$个数。若编译器支持C99标准,可直接声明变长数组`int arr[n]`;否则需动态分配内存(如`malloc`)。 #### 2. **逆序交换逻辑** - **对称交换**:遍历数组的前半部分,将第$i$个元素与倒数第$i$个元素交换。 **公式**: $$ \text{交换 } arr[i] \leftrightarrow arr[n-1-i] \quad (i=0,1,\dots,\lfloor n/2 \rfloor -1) $$ - **示例**:若数组为`[1,2,3,4,5]`,交换过程如下: - $i=0$:交换`arr[0]`和`arr[4]` → `[5,2,3,4,1]` - $i=1$:交换`arr[1]`和`arr[3]` → `[5,4,3,2,1]` #### 3. **输出结果** - 遍历数组并输出所有元素。 --- ### 完整代码实现 ```c #include <stdio.h> int main() { int n; printf("请输入元素个数n: "); scanf("%d", &n); int arr[n]; // C99变长数组(若编译器不支持,改用动态内存分配) printf("请输入%d个整数: ", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } // 逆序交换 for (int i = 0; i < n / 2; i++) { int temp = arr[i]; arr[i] = arr[n - 1 - i]; arr[n - 1 - i] = temp; } printf("逆序后的数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` --- ### 关键点解释 1. **间复杂度**:$O(n)$,仅需遍历数组的一半进行交换。 2. **空间复杂度**:$O(1)$(仅需常数级额外空间存储临变量`temp`)。 3. **变长数组**:C99允许用变量定义数组长度(如`int arr[n]`),若编译器不支持,需改用动态内存分配: ```c int *arr = (int*)malloc(n * sizeof(int)); // 使用后释放内存 free(arr); ``` --- ### 示例输入输出 **输入**: ``` 请输入元素个数n: 5 请输入5个整数: 1 2 3 4 5 ``` **输出**: ``` 逆序后的数组: 5 4 3 2 1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值