7-1 将数组中的数逆序存放 (20 分)本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。

输入格式:

输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。

输出格式:

在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。

输入样例:

4                                                                                                
10 8 1 2                                                                                        

输出样例:

2 1 8 10                                                                                        

#include<stdio.h>
int main()
{
    int n,i;
    int arr[n];
    scanf("%d",&n);
    for(i=n-1;i>=0;i--)//输入n个整数
    {
        scanf("%d ",&arr[i]);
    }
    for(i=0;i<n;i++)//逆向输出
    {
        printf("%d",arr[i]);
        if(i<n-1)
            printf(" ");
    }
    return 0;
}

PTA里运行出来是没有问题的,但是在vc2010版里运行有点问题,

<think> 根据用户需求,需要编写一个程序来实现以下功能: 1. 将给定的n个整数存入数组。 2. 将数组中的逆序存放。 3. 按顺序输出数组元素逆序后的数组)。 根据引用中的多个示例,我们可以总结出几种方法,但需要注意以下几点: - 输入:首先输入整数n,然后输入n个整数- 逆序存放:可以通过交换数组元素来实现,例如将第i个元素与第n-i-1元素交换,循环进行到数组中间。 - 输出:按顺序输出逆序后的数组,相邻字用空格开,行末不得有多余空格。 我们将参考引用中的示例,编写一个清晰且符合要求的程序。 方法选择: 引用[4]和引用[5]提供了较为简洁的实现方式,其中引用[5]使用了函来模块化代码,但引用[4]的代码更简洁,且能正确处理输出格式(行末无空格)。 我们将采用以下思路: 1. 读入整数n。 2. 读入n个整数存入数组。 3. 使用循环,交换数组的前一半元素和对应的后一半元素(即第i个和第n-1-i个交换,i从0到n/2-1)。 4. 输出数组,注意第一个元素直接输出,后面的元素输出前加一个空格,这样可以避免行末空格。 但是,引用[5]中输出别处理前n-1个和最后一个元素,也能避免行末空格。我们可以选择其中一种。 这里我参考引用[4]的输出方式:在输出每个元素时,判断是否是第一个元素,如果是第一个则直接输出字,否则先输出一个空格再输出字。 具体代码实现如下: </think> ### 数组逆序存放输出方法 根据引用内容,实现数组逆序存放并按顺序输出的核心步骤如下: #### 方法一:直接交换法(推荐) ```c #include <stdio.h> int main() { int n; scanf("%d", &n); // 输入数组长度 int arr[n]; // 声明数组 // 1. 存入数组 for(int i = 0; i < n; i++) scanf("%d", &arr[i]); // 2. 逆序存放(首尾交换) for(int i = 0; i < n/2; i++) { // 只需遍历前一半元素 int temp = arr[i]; arr[i] = arr[n-1-i]; // 交换对称位置元素 arr[n-1-i] = temp; } // 3. 按顺序输出(严格空格控制) for(int i = 0; i < n; i++) { printf("%d", arr[i]); if(i < n-1) printf(" "); // 非末尾元素后加空格 } return 0; } ``` **执行流程**: 1. 输入数组长度 `n` 2. 循环读入 `n` 个整数存入数组 3. 通过首尾对称交换实现逆序- 交换索引 `i` 与 `n-1-i` 的元素 - 只需遍历数组前一半(`n/2` 次) 4. 输出时检测非末尾元素追加空格 #### 方法二:双指针法 ```c #include <stdio.h> void reverse(int arr[], int n) { int *left = arr; // 指向首元素 int *right = arr + n - 1; // 指向末元素 while(left < right) { // 双指针向中间逼近 int temp = *left; *left = *right; *right = temp; left++; right--; } } int main() { int n; scanf("%d", &n); int arr[n]; for(int i = 0; i < n; i++) scanf("%d", &arr[i]); reverse(arr, n); // 调用逆序 for(int i = 0; i < n; i++) printf("%d%c", arr[i], (i==n-1)?'\n':' '); return 0; } ``` **优势**: - 使用指针直接操作内存,效率更高 - 逻辑清晰易扩展(如链表逆序)[^5] #### 关键注意事项 1. **避免数组越界**:交换时索引计算需满足 `0 ≤ i < n/2` 2. **输出格式控制**:行末不能有多余空格(通过条件判断解决) 3. **时间复杂度**:$O(n)$(遍历半个数组) 4. **空间复杂度**:$O(1)$(仅用常级临时变量) 5. **奇偶兼容**:`n/2` 在奇数组长度时自动向下取整(如n=5时交换前2对) > 示例输入输出: > 输入:`5` `10 20 30 40 50` > 输出:`50 40 30 20 10` > (验证:原首位元素`10`和`50`完成交换)[^3][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值