[蓝蓝计算机考研算法]-day10奇偶数分离

144 阅读1分钟

题目描述

有一个整型偶数n(2<= n <=10000),你要做的是:先把1到n中的所有奇数从小到大输出,再把所有的偶数从小到大输出。

输入描述

输入第一行有一个整数i(2<=i<30)表示有 i 组测试数据;每组有一个整型偶数n。

输出描述

输出第一行输出所有的奇数。第二行输出所有的偶数。

思路

法1

  • 根据题目的描述,按序写下来即可。

  • 用n%2==0来判断奇偶,若“真”,则为奇数,若“假”,则为偶数。

  • 然后将奇数和偶数分别存进不同的数组中,最后将数组输出。

法2

  • 用while循环,i--,来表示测试用例组数

  • 根据奇数和偶数相隔1个数的规律,可以用循环加2的方式,分别从1(奇数)和2(偶数)开始循环,然后分别输出奇数和偶数,就可以省去再用数组存储的步骤。

具体实现

法1

#include<bits/stdc++.h>
using namespace std;
int main(){
	int i;
	cin>>i; //输入i组测试数据
	for(int j=0; j<i; j++){
		int n;
		int a[1000]; //存奇数
		int b[1000]; //存偶数 
		int cnt1=0,cnt2=0; 
		cin>>n;
		for(int k=1; k<=n; k++){
			if(k%2==0) b[cnt2++]=k; //是偶数,存偶数数组
			else a[cnt1++]=k; //是奇数,存奇数数组
		}
		for(int m=0; m<cnt1; m++) //输出奇数 
			cout<<a[m];
		cout<<endl;
		for(int m=0; m<cnt2; m++) //输出偶数 
			cout<<b[m];
		cout<<endl;
	}
	return 0;
}

法2

#include<bits/stdc++.h>
using namespace std;
int main(){
	int i;
	cin>>i; //输入i组测试数据
	while(i--){
		int n;
		cin>>n;
		for(int k=1; k<=n; k+=2) //输出奇数 
			cout<<k<<" ";
		cout<<endl;
		for(int k=2; k<=n; k+=2) //输出偶数 
			cout<<k<<" ";
		cout<<endl;
	}
	return 0;
}

小结

  • 题目难度:简单。注意一些格式、换行之类的书写,不要出错。

  • 法1比较直观,按描述写即可,但是时间复杂度和空间复杂度度都很大。

  • 法2为优化后代码,比较简洁,且降低了空间复杂度。

  • 代码能优化还是要优化一下,多思考,也会对编程思想和能力提升有帮助!