目录
1.0【问题描述】
将某课程上课周次转换为课表显示形式。从键盘录入上课周次,将其输出为逗号分隔的字符串,将连续周次合并为 x-y的形式。
【输入形式】
总共输入1行,其为空格分隔的自然数数列,输入必须从小到大排列,用-1表示输入结束。
【输出形式】
只输出1行。不连续的周次之间用英文逗号“,”分开,连续的周次之间用英文横线“-”连接起止周
【样例输入1】
1 2 3 4 5 6 -1
【样例输出1】
1-6
【样例输入2】
1 3 4 5 6 8 9 10 12 13 14 16 18 -1
【样例输出2】
1,3-6,8-10,12-14,16,18
【样例输入3】
3 -1
【样例输出3】
3
2.0顺顺思路
可以用一个循环,来判断每次输入的数,是不是前者+1,是不是等于-1;输出放循环里,每次循环后只要判断的这个数不为-1;都要输出“,” (看不懂的话,就去看代码的注释,我实在是描述不好 语文太拉了(狗头))
3.0上代码
/*#include<iostream>
using namespace std;
int main()
{
int left = -100, right = -100,rec; //至于为啥初值设-100,别问,问就是随便设的,只要是非自然数就行
while(1)
{
cin >> rec; //循环输入 对输入的每个数进行判断
if (rec == right + 1) {
right = rec; //如果是前者的+1,就更新right
}
else
{
if (left >= 0)
{
if (left == right)
{
cout << left;
}
else
{
cout << left << "-" << right;
}
if (rec != -1) cout << ',';
}
left = rec; //重新使left==right 准备下一次循环
right = rec;
}
if (rec == -1) break; //如果输入的数是-1,就结束循环
}
return 0;
另一种解法是用数组,由于数组我只是看了教材,可以说很废,不是很会用(所以我求助了我的同学(万能[狗头]))
#include <iostream>
using namespace std;
int main()
{
int a[100];
int i=0;
int x=0 , y ;
do
{
cin>>a[i]; //输入数组
i++;
} while(a[i-1]!= -1 );
for(y=1;y<i;y++)
{
if(a[y]-a[y-1]==1)
continue; //如果等于前者加1,就跳出循环,进入下一次循环
else {
if(a[x]==a[y-1])
{
cout<<a[x]; //如果后者不为前者加1,就把前者扔进一个新的数组
x=y; //更新左界
}
else
{
cout<<a[x]<<'-'<<a[y-1];
x=y; //更新左界
}
if (a[x] != -1)
cout << ',';
}
}
return 0;
}
4.0乱总结
其实数组和循环的解法差不多,本质上都是一样的,主要是要抓住左右界,这道题冒貌似还有更简单的解法,不过涉及到很后面的知识 等我学会后回来更新
自我感觉这篇文章讲得不是很通透,但我实在不知道该怎么进一步讲了,如果看不明白的话给我留言(我给讲),也欢迎大家指正