题目内容:
班级第一次列队,通常老师会让同学按身高排成一列,然后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;
}
综上,比较一下这四种方式的的区别:
个人觉得思路一最好理解