一.题目
二.分析与思路
题目要求的所谓的数组折叠只不过是不停地把数组的右半部分挨个加到数组左半部分上;
首先,题目中的n不是数组长度,才是原数组长度,我们需要使用pow函数来计算长度;
其次由于有对半操作的出现,为了方便,我们选择储存时下标从1开始,这样数组对半时的长度计算就直接是:
最后,总体思路就是先开一个外部循环代表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;
}
四.评价
一道简单的循环嵌套题,,难度不大