NOIP 普及组初赛 · NOIP 2008 普及组初赛试题 第 25 题

阅读程序 · 答案 5 4 10 1 6 22 -59 -6 -11 -6 · 考点:输入输出、位运算、分支结构、循环结构、一维数组

← 整套速查表 NOIP 普及组初赛 全部真题

题目

阅读程序写结果:

#include <iostream>
using namespace std;

void func(int ary[], int n )
{
	int i=0, j, x;
	j=n-1;
	while(i<j)
	{
		while (i<j&&ary[i]>0) i++;
		while (i<j&&ary[j]<0) j--;
		if (i<j){
			x=ary[i];
			ary[i++]=ary[j];
			ary[j--]=x;
		}
	}
}

int main()
{
	
	int a[20], i, m;
	m=10;
	for(i=0; i<m; i++)
	{
		cin>>a[i];
	}
	func(a, m);
	for (i=0; i<m; i++)
		cout<<a[i]<<" ";
	cout<< endl;
	return 0;
}

输入:5 4 -6 -11 6 -59 22 -6 1 10

答案:5 4 10 1 6 22 -59 -6 -11 -6

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构一维数组

解题思维

看到双指针 i 找正数、j 找负数且中间有零时,先模拟 i 跳过正数、j 跳过负数,再判断是否交换。

常见错误

易把 i 当成找负数、j 当成找正数,或忽略交换后指针自增导致越界判断错误。

详细解析(节选)

考点:双指针重排数组

程序在做什么

输入 10 个数,用双指针将正数移到前面、负数移到后面,中间若有零则留在中间。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断