题目描述
小浩喜欢对数列正序排列,小彤喜欢对数列逆序排列,为此小浩和小彤吵得不可开交,最后的结局是小浩和小彤的数列交替输出,小浩的数还是正序,小彤的数还是逆序。
输入
从键盘输入两个正整数m和n(0<m,n<100000),用空格隔开。
输出
交替输出1到m和n到1的自然数列,每个数之后有一个空格。
样例输入 Copy
3 5
样例输出 Copy
1 5 2 4 3 3 2 1
方法一
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n;
int i,j;
scanf("%d%d",&m,&n);
for(i=1,j=n;i<=m||j>=1;i++,j--)
{
if(i<=m)
printf("%d ",i);
if(j>=1)
printf("%d ",j);
}
return 0;
}
方法二:先对相同部分进行处理,在对多余部分进行处理
思路来源@花果山高级会议jiong哥
#include<stdio.h>
int main()
{
int m,n,a[200000];//防止数据溢出
int j=1,k;
scanf("%d %d",&m,&n);
k=n;
int i;
if(m==n)
{
for(i=0;i<m+n;i++)
{
if(i%2==0)
{
a[i]=j;
j++;
}
if(i%2!=0)
{
a[i]=k;
k--;
}
}
}
if(m<n)
{
for(i=0;i<m+m;i++)//将相等部分进行与m=n条件一样的运算
{
if(i%2==0)
{
a[i]=j;
j++;
}
if(i%2!=0)
{
a[i]=k;
k--;
}
}
//对多出逆序处理
for(int p=1;p<=n-m;p++)//将多出部分进行赋值
{
a[i]=k;
k--,i++;
}
}
if(m>n)
{
for(i=0;i<n+n;i++)//将相等部分进行与m=n条件一样的运算
{
if(i%2==0)
{
a[i]=j;
j++;
}
if(i%2!=0)
{
a[i]=k;
k--;
}
}
//对多出正序处理
for(int p=1;p<=m-n;p++)//将多出部分进行赋值
{
a[i]=j;
j++,i++;
}
}
for(int i=0;i<m+n;i++)
{
printf("%d ",a[i]);
}
return 0;
}