西电期末1001.数组折叠

一.题目

二.分析与思路

题目要求的所谓的数组折叠只不过是不停地把数组的右半部分挨个加到数组左半部分上;

首先,题目中的n不是数组长度,2^{n}才是原数组长度,我们需要使用pow函数来计算长度;

其次由于有对半操作的出现,为了方便,我们选择储存时下标从1开始,这样数组对半时的长度计算就直接是:

                            l=l/2

最后,总体思路就是先开一个外部循环代表m次折叠,内部再开一个循环用来具体将对称的右半部分的数值加到左半部分,即实现一次折叠(代码中“+1”的操作时下标从1开始带来的一个小小插曲,看来有得必有失),最后打印答案即可(注意数据之间用空格隔开)

三.代码实现

#include<bits/stdc++.h>//万能头文件
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    n = pow(n, 2);//幂函数计算数组长度
    int num[n];
    for(int i = 1; i <= n; i++) {
        scanf("%d", &num[i]);
    }//从1开始储存便于后续折半的操作
    int l = n;//用于储存折叠后数组的长度
    for(int i = 0; i < m; i++) {
        l /= 2;//将长度折叠
        for(int i = 1; i <= l; i++) {
            num[i] += num[2 * l + 1 - i];
        }//不断地将对称的右边数值加到左边
    }//m次折叠操作
    for(int i = 1; i <= l; i++) {
        printf("%d ", num[i]);
    }
    return 0;
}

四.评价

一道简单的循环嵌套题,,难度不大

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值