程序设计入门C语言 --- 分队列

题目内容:

班级第一次列队,通常老师会让同学按身高排成一列,然后1、2报数,喊到1的同学向前一 步,就这样,队伍就变成两列了。假设现在一个班级有n个同学,并且他们已经按身高排成 了一列,同学按身高从1到n编号,你能告诉我最后哪些编号的同学站在了第一列么? 

输入格式:

输入一个正整数n,表示班级的人数。

输出格式:

按顺序输出所有在第一列的同学对应的编号,每两个编号之间用一个空格隔开,最后一个编号后面没有空格。

输入样例:

11

输出样例:

1 3 5 7 9 11

时间限制:500ms内存限制:32000kb


看完本题你可能最先想到的就是:遍历1~n之间的数字,若为奇数则正常输出,偶数则输出“  ”(即空格),于是写出下面的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
   int n = 0;
   int i = 0;
   scanf("%d", &n);
   for (i = 1; i <= n; i++)
   {
	   if (i % 2 != 0)
           {
		  printf("%d", i);
	   }
	   else
	   {
		  printf(" ", i);
	   }
   }
   return 0;
}

试一下运行结果

看似好像对,但是当输入为偶数时,就出问题了。如下,由于遍历到边界数字6时,6为偶数,输出空格,所以有误

重新理一下思路:我们可以按照输入的数奇偶分别进行处理,并且把最后一个输出的数字单独处理。当输入的数字n为奇数时,遍历所有1~n(不包括n)之间的奇数,输出方式为“%d  ”(数字空格),最后单独输出n;当输入的数字n为偶数时,只需遍历1~n-1(不包括n-1)之间的奇数,输出方式同上。这样采用限制遍历范围从而避免了最后一个编号后出现空格。

代码如下:(“数字空格”)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
   //思路一:n一定要分奇偶,限制检测范围
   int n = 0;
   int i = 0;
   scanf("%d", &n);
   if (n % 2 != 0)
   {
	   for (i = 1; i < n; i += 2)
	   {
		   printf("%d ", i);
	   }
	   printf("%d", i);
   }
   else
   {
	   for (i = 1; i < n-1; i += 2)
	   {
		   printf("%d ", i);
	   }
	   printf("%d", i);
   }
   return 0;
}

本题还有其他几种解决办法,具体如下--->

思路二:由于无论n 为奇数还是偶数,第一个数字1总是会输出,所以可以把1和其他数字分离开来。先单独输出数字1,然后其余按照“空格数字”输出,当然,循环遍历数字也只需循环奇数即可。

代码如下:(“空格数字”)

//思路二:先输出1,然后按照“空格数字”输出
int main()
{
   int n = 0;
   scanf("%d", &n);
   int i = 1;
   printf("%d", i);
   for (i = 3; i<=n; i += 2)
   {
	   printf(" %d", i);
   }
   return 0;
}

思路三:先输出数字,再在条件语句中单独处理空格问题。思路三其实与思路一原理一致,只不过它把思路一奇偶分开处理合并了。

代码如下:(“数字+空格”)

//思路三:把所有的奇数输出来。空格问题在条件语句中处理
int main()
{
   int n = 0;
   scanf("%d", &n);
   for (int i = 1; i <= n; i++)
   {
	 if (i % 2 != 0)
	 {
		 printf("%d", i);
		 if (i != n&&i!=n-1)//此处同时处理n为奇数和偶数两种情况
		 {
			printf(" ");
		 }
	 }
   }
   return 0;
}

思路四:与一原理相同,也采用“数字空格”思路,只不过这里是用一个while语句同时限制了n为奇数和偶数的检测范围,再把最后一位单独拿出来处理。

代码如下:(“数字空格”)

//思路四:用while语句,不管你为奇数偶数,统一都把最后一位单独拿出来处理
int main()
{
  int n = 0;
  scanf("%d", &n);
  int i = 1;
  while (i < n-1)
  {
	  if (i % 2 != 0)
	  {
		  printf("%d ", i);
		  i += 2;
	  }
  }
  printf("%d", i);
  return 0;
}

综上,比较一下这四种方式的的区别:

个人觉得思路一最好理解


 

猜你喜欢

转载自blog.csdn.net/melody_1016/article/details/81085897